■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

Win32API質問箱 Build27
751 名前:デフォルトの名無しさん :05/02/07 23:14:19
目からうろこが。
おもっくそMSDNにも書いてあったし。
こういうお約束的なAPIって案外調べたりしないもんだから見落としてることもあるんだろうな。

752 名前:デフォルトの名無しさん :05/02/07 23:36:25
>>748
えー、閉じなきゃいけないんですか?
てゆーか、CloseHandleって関数の存在を始めてしりました。

753 名前:デフォルトの名無しさん :05/02/08 00:32:39
ファイル操作はfopen?

754 名前:デフォルトの名無しさん :05/02/08 00:36:01
>>753
CreateFile に特有の機能が必要ないときは迷わず

755 名前:デフォルトの名無しさん :05/02/08 00:52:42
ReadFileで読み込むと
lpNumberOfBytesReadを特殊な条件化じゃないとNULL指定できないのが面倒なんだよなぁ

756 名前:デフォルトの名無しさん :05/02/08 01:04:27
すみません教えてください

APP(A)からDLL(B)を呼び出しているのですが、DLL(B)からさらにDLL(C)をLoadLibrayでロードしています。
DLL(C)からDLL(B)の関数をGetProcAddress()で読んでいるのですが、DLL(C)はハードコーディングで
GetProcAddress(GetModuleHandle(NULL), "Foo")
みたいになっちゃっていてどうもAPP(A)の空間しか見れて無いらしくDLL(B)の関数がGetProcAddressできてません。
明示的にAPP(A)の関数の名前空間にDLL(B)に関数も含めるにはどうすればいいのでしょうか?

757 名前:デフォルトの名無しさん :05/02/08 01:09:16
NULLぽ

758 名前:デフォルトの名無しさん :05/02/08 01:22:45
>>740
スレッドが終了するときに、 シグナル状態になるので、それを

WaitForSingleObject()あるいは
WaitForMultipleObjects()で検知して

で、スレッド終了後の処理を始めればいいんじゃないの

759 名前:デフォルトの名無しさん :05/02/08 02:01:58
>>758
漏れはいつもそうしてる
スレッド作成直後にCloseHandle()する勇気がなかったんで…

760 名前:デフォルトの名無しさん :05/02/08 03:50:12
逆に寧ろ、終了を知る必要がないならとっととCloseHandle()してしまうべきだと思うのだが。
子への通知はPostThreadMessage()でいいし、逆方向も子に適当なハンドルを渡しておいてそれにMessageを投げさせれば済むしね。

761 名前:デフォルトの名無しさん :05/02/08 04:40:43
>>756
Read/WriteProcessMemoryかな。

762 名前:デフォルトの名無しさん :05/02/08 07:22:42
CloseHandleなんて呼ぶ必要ないよ。

763 名前:デフォルトの名無しさん :05/02/08 07:36:40
>>762
その心は?

764 名前:デフォルトの名無しさん :05/02/08 10:15:07
д・) >762がランチャーこさえたら……
A・) ガクブルガクブル

765 名前:デフォルトの名無しさん :05/02/08 10:29:58
>>764
CreateProcess()はエンドユーザ向きじゃないので、
あまりランチャーでは使わんでしょ。
カスタマイズ可能なランチャーならShellExecute()にすると思われ。

766 名前:デフォルトの名無しさん :05/02/08 14:14:47
>>756
APP(A)に"Foo"関数をエクスポートさせて(保障されてるかは知らない)
APP(A)の"Foo"からDLL(B)の関数を呼んでみてはどうだろか。

767 名前:デフォルトの名無しさん :05/02/08 14:24:07
>>756
日本語が良く分からない
文を短くしろ
主語述語の関係をはっきりさせろ

768 名前:デフォルトの名無しさん :05/02/08 15:12:06
>>756

>>766 と似たようなもんだけど、APP(A) で forwarder RVA で
DLL(B) の関数をエクスポートする。APP(A) の .def ファイルで、

EXPORTS
Foo = B.Foo

って書くのねん。(ファイル名が B.DLL の場合)


769 名前:デフォルトの名無しさん :05/02/08 15:38:24
おぉ、目から鱗ビーム

770 名前:デフォルトの名無しさん :05/02/08 16:01:55
Caretの真下に窓出したいんだけどCaretの高さってどうやって知るの?

771 名前:デフォルトの名無しさん :05/02/08 16:24:57
ListView_SortItemsでリストビューをソートしようとしたんですが
コールバック関数の第一第二引数が同じものがきていて機能しません。
いくつかサンプルみたんですがどれも同じようにやっていて、原因がわかりません。
知っている方いたら是非ご教示お願いします…

772 名前:デフォルトの名無しさん :05/02/08 16:27:50
>>771
んなこたーない。
ソース晒してみ。

773 名前:デフォルトの名無しさん :05/02/08 16:43:21
>>771
コールバックにくるlParam1, lParam2は各リストアイテム(LVITEM)のlParamだよ。
LVITEM挿入時とかにlParam同じの入れてればコールバックにも同じのしかこないよ。

一番簡単な流れで言うと
1:アイテム挿入時にLPARAMに重複しない連番を入れておく
2:コールバック関数内でFINDITEMとかでlParamの番号を元に目的のデータを持ってくる。
3:2で持って来た実データを比較し、比較結果を返す。

同じのしかこないなら
LVITEM挿入時にlParamに値入れてないのでは?(memosetやZeroMemoryでの0が入ってる)

774 名前:69式フリーPG ◆hND3Lufios :05/02/08 17:11:50
すぐに閉じることが出来るけど、アプリ終了時に全てのスレッドの
終了をプライマリスレッドが待機できるようにとっておくけどなぁ。<スレッドハンドル



775 名前:デフォルトの名無しさん :05/02/08 17:24:40
>>774
閉じられるとは言ってもスレッドハンドルいらないケースってまずないような気がするね

776 名前:デフォルトの名無しさん :05/02/08 17:32:58
Load_Bmp(Back_DC,"test.bmp");
と記述すると、
'Load_Bmp': 識別子は、引数依存の照合を使用しても見つかりません。
とエラーが出るのですが、Load_Bmpの使い方間違ってますか?

777 名前:デフォルトの名無しさん :05/02/08 17:40:05
>>776
LoadBitmapなら、Winuser.hで宣言されてるはずだけど

Load_Bmpという関数は知らないな
自作関数なら、宣言を見直せ

778 名前:デフォルトの名無しさん :05/02/08 17:41:34
Load_Bmpとは何? Win32にあった?

779 名前:771 :05/02/08 18:18:10
>>772 >>773
レスありがとうございます。
lParamが未設定で、設定してもいかないので悩んでいたら
アイテム挿入時にLVIF_PARAMフラグを指定していなかっただけでした。

今までBCBでやっていたのでこういう部分はほとんど触れなかったんですが
なかなかおもしろいです。
ありがとうございました。

780 名前:デフォルトの名無しさん :05/02/08 18:24:17
>>775
>760ってことでしょ。

781 名前:デフォルトの名無しさん :05/02/08 18:30:57
スレッドがウインドウプロシージャを必ず持つのならそれでも良いけどなw

782 名前:デフォルトの名無しさん :05/02/08 19:39:23
>>760
子に終了メッセージを投げて、子から終了したよメッセージが来るまで
待機するのかな。で、その返答メッセージを親が受け取った時って、
子のスレッドは*完全*に終了しているのかな?

783 名前:デフォルトの名無しさん :05/02/08 19:44:29
>>782
「終了したよ」メッセージではなく
「お手討ちにどうぞ」メッセージならどうかな?

784 名前:デフォルトの名無しさん :05/02/08 19:53:15
_beginthreadexで本当に開放いいの?
CreateProcessとかCreateThreadとかはいざ知らず。
英語にも日本語にも先に開放して良いと書いてないよ・・・

785 名前:デフォルトの名無しさん :05/02/08 20:00:03
Cランタイム内で確保されたTLSはどのタイミングで解放されるんだろう。

786 名前:デフォルトの名無しさん :05/02/08 20:19:33
VC++とか持ってるならCRT版の_beginthreadexなんかがなにやってるかはソース見れば分かる。

787 名前:デフォルトの名無しさん :05/02/08 20:27:27
>>786
おおーソースあったのねん、知らなかった。thx
おおー、読んだ読んだ、なるほど。ありがと。
あと、NTカーネルのソースありませんか、なんちって


788 名前:デフォルトの名無しさん :05/02/08 20:42:23
自作クラスのWindowStyleだけで使う独自な値って、どの辺の値にしたらいいもの?
(EditTextだとES_LEFTの0x0000L〜ES_NUMBERの0x2000L辺りみたいだけど)
何か、WS_POPUPが0x80000000とかWS_TABSTOPが0x00010000とかみたいだし、
下4桁は自由に使っても競合しない?(他のクラスを継承した場合とか以外)

789 名前:デフォルトの名無しさん :05/02/08 20:51:25
メインのウィンドウにエディットボックスを2つ表示してTABで移動できるようにしたくて

CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 30, 30, 80, 24, hWnd, (HMENU)ID_EDIT1, hInst, NULL);
CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 140, 30, 80, 24, hWnd, (HMENU)ID_EDIT2, hInst, NULL);
CreateWindow("BUTTON", "ボタン", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP, 300, 30, 80, 24, hWnd, (HMENU)ID_BTN, hInst, NULL);

としてみたんですが、ポーンって音が鳴るだけでした。
MSDN見てみたらWS_EX_CONTROLPARENTの説明が
「ユーザーが[Tab]キーを使って子ウィンドウ間を移動できるようにします。」
だったのでこれかと思ってCreateWindowExに変えてこのスタイルを適用してみたんですけど、
やっぱりできませんでした。何か間違っていますか??


790 名前:デフォルトの名無しさん :05/02/08 21:15:36
エディットコントロールに一定以上の容量を確保したバッファを送るとキーボードからの入力を受け付けなくなるのですがなぜでしょうか?教えてください

791 名前:デフォルトの名無しさん :05/02/08 21:45:12
9x系?

792 名前:デフォルトの名無しさん :05/02/08 21:54:30
>787
このまえ流出したって騒ぎがあったな、そういや。

793 名前:デフォルトの名無しさん :05/02/08 22:07:24
>>761
>>766
>>768
おおアリガd 早速やってみる。

>>767
ごめんなさい。自然言語は苦手なんです。

794 名前:デフォルトの名無しさん :05/02/08 22:39:01
_beginthreadexはソースないだろ

795 名前:デフォルトの名無しさん :05/02/08 22:42:00
/***
*threadex.c - Extended versions of Begin (Create) and End (Exit) a Thread
*
* Copyright (c) Microsoft Corporation. All rights reserved.


796 名前:デフォルトの名無しさん :05/02/08 22:55:04
794の目はfusianasan?

797 名前:デフォルトの名無しさん :05/02/08 23:02:45
warata

798 名前:デフォルトの名無しさん :05/02/08 23:08:46
まー俺はウニバーサルだし、仕方が無い

799 名前:デフォルトの名無しさん :05/02/08 23:13:59
うぱにしゃっと?

800 名前:デフォルトの名無しさん :05/02/08 23:28:20
MDIにツールバーをつけ、ChildWindowを最大化するとツールバーに合体(?)せずに上書きしてしまいます。
これを回避するにはどうすればよろしいでしょうか?
サンプルなどありましたら宜しくお願いします。


801 名前:デフォルトの名無しさん :05/02/08 23:36:06
動的確保したメモリに音楽ファイルのデータを書き込んで
そのデータを再生したいのですが、

<具体例>
暗号化した音楽ファイル(DAT) ー> 復号 ー> MP3として書き出す −> MICIで再生

ではなく

暗号化した音楽ファイル(DAT) ー> 復号 ー> データを再生

APIのみで何かいい方法はありませんか?

802 名前:デフォルトの名無しさん :05/02/08 23:41:07
>>801
メディアフォーマットSDKあるからそれダウンロード汁(無料)

803 名前:デフォルトの名無しさん :05/02/08 23:42:17
>>801
復号したデータをトリプルバッファでwaveOutWrite

804 名前:801 :05/02/09 00:28:10
>>802
どうも!
MSDNで”Windows Media Format 7.1 SDK”なるものを発見できました。

>>803
どうも!
”トリプルバッファ”で検索したら使えそうなサンプルが見つかりました。
早速試してみることにします。

805 名前:デフォルトの名無しさん :05/02/09 00:34:24
>>804
トリプルバッファでストリーミング再生するとマルチスレッド組むようになるだろうから、
少し上のマルチスレッドのレスも参考にするとよいぞ
関係ないが、俺は昔、再生スレッドとwaveOutOpen()の同期を取り忘れてて気づくのに骨が折れたことがある

806 名前:デフォルトの名無しさん :05/02/09 01:36:42
質問です。
CreateFile系API関数にはバイナリやテキストモードの設定できる項目がないようですが、
これはバイナリ形式しか取り扱えないということなのでしょうか?

807 名前:デフォルトの名無しさん :05/02/09 01:52:19
>>806
もう少しひねりが欲しい

808 名前:デフォルトの名無しさん :05/02/09 02:07:59
質問です。 
CreateFile系API関数にはアペンドモードの設定できる項目がないようですが、 
これは上書き形式しか取り扱えないということなのでしょうか? 

809 名前:デフォルトの名無しさん :05/02/09 04:51:24
>>806
そうで御座います。

面倒だったら素直に fopen() でも使っとけ。

>>808
DWORD dwDummy;
HANDLE hFile = CreateFile("TestFile.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
SetFilePointer(hFile, 0, 0, FILE_END);
WriteFile(hFile, "Test\r\n", 6, &dwDummy, NULL);

面倒だったら素直に fopen() でも使っとけ。

810 名前:デフォルトの名無しさん :05/02/09 07:11:08
>>809
はいはい

811 名前:806 :05/02/09 12:35:07
>>809
_wfopen()を使うことにしました

812 名前:デフォルトの名無しさん :05/02/09 14:21:11
>>811
_tfopenもよろしく
これもAPIじゃないけど。

813 名前:デフォルトの名無しさん :05/02/09 15:38:52
listviewで指定した行を選択させるにはsendmessageにどういった引数を指定すればいいですか?

814 名前:69式フリーPG ◆hND3Lufios :05/02/09 15:53:35
第1引数にHWND

815 名前:デフォルトの名無しさん :05/02/09 15:53:38
2回呼ぶ
先にindex調べて次に中身



816 名前:813 :05/02/09 17:21:39
例えば3行目の行を選択させるにはどの様にすればいいいですか?

817 名前:デフォルトの名無しさん :05/02/09 17:32:50
ミリ秒単位の時間を得たい場合はどのAPIを使えばいいのでしょうか?

818 名前:デフォルトの名無しさん :05/02/09 17:36:24
systemtime

819 名前:デフォルトの名無しさん :05/02/09 17:37:59
GetSystemTimeだごめん

820 名前:デフォルトの名無しさん :05/02/09 17:50:22
まぁ、単位がミリ秒ってのと精度は別なわけだが。

821 名前:デフォルトの名無しさん :05/02/09 17:52:18
そういうなよ、
そんなら、あなたのパソコンはUTCに完全に同期してるとでも?

822 名前:デフォルトの名無しさん :05/02/09 18:15:20
>>813 おながいします

823 名前:813 :05/02/09 18:15:39
'定数
Const LVM_FIRST As Long = &H1000
Const LVS_EX_FULLROWSELECT As Long = &H20
Const LVM_SETEXTENDEDLISTVIEWSTYLE As Long = (LVM_FIRST + 54)

'コード
SendMessage List1.hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, ByVal LVS_EX_FULLROWSELECT

指定行を選択させるには↑でいいでしょうか?

824 名前:デフォルトの名無しさん :05/02/09 18:25:40
>>823
VB?
なつかしいな…

825 名前:デフォルトの名無しさん :05/02/09 18:45:44
>>821
精度と UTC に何の関係が?

826 名前:デフォルトの名無しさん :05/02/09 18:48:16
>>825
ほう、あんたが、精度というのを持ち出したんだろうが。
別時間で生きてる方にはわからんかもね

827 名前:デフォルトの名無しさん :05/02/09 19:12:46
>>826
> ほう、あんたが、精度というのを持ち出したんだろうが。

別時間で生きてる方にはわからんかもね 820≠825 ですが何か?

> 別時間で生きてる方にはわからんかもね

説明できないので逃げるのですか?

828 名前:デフォルトの名無しさん :05/02/09 19:13:26
うわあ、すげえバカ。

829 名前:デフォルトの名無しさん :05/02/09 19:15:36
時刻の精度と時間の精度をごっちゃにするなよ

830 名前:デフォルトの名無しさん :05/02/09 19:21:01
GetSystemTimeはUTCを得るものだがな
バカだね、WindowsはりあるタイムOSでは無いのに

831 名前:デフォルトの名無しさん :05/02/09 19:43:11
だから時刻合って無くても時間は測れるだろ。
まあGetSystemTimeでミリ秒時間を計測する奴もどうかと思うが。
Windowsでもミリ秒ぐらいなら十分正確に測れる。

832 名前:デフォルトの名無しさん :05/02/09 19:43:34
寒天寒天!!

833 名前:デフォルトの名無しさん :05/02/09 20:40:53
GetSystemTimeより、GetSystemTimeAsFileTimeの方がおすすめ。

834 名前:デフォルトの名無しさん :05/02/09 20:51:06
>>812
APIじゃないってどういう意味なんですか?

835 名前:デフォルトの名無しさん :05/02/09 20:54:22
macro?

836 名前:デフォルトの名無しさん :05/02/09 20:55:56
VC独自のCRT.

837 名前:デフォルトの名無しさん :05/02/09 21:09:55
>>836
がどうしたの?

838 名前:デフォルトの名無しさん :05/02/09 21:46:57
CRTってモニタの事だよね。

839 名前:デフォルトの名無しさん :05/02/09 21:50:11
ちがうよ

840 名前:デフォルトの名無しさん :05/02/09 22:00:02
これ
http://support.microsoft.com/kb/q140584/

841 名前:デフォルトの名無しさん :05/02/09 22:05:03
ついでに
CRTは、モニタではなく、ブラウン管のこと。
だから、液晶CRTとかはありえない

842 名前:デフォルトの名無しさん :05/02/09 22:07:10
時計としての時間じゃないけど

精度がほしい場合
QueryPerformanceCounter
QueryPerformanceFrequency
が良いとか聞いたような。

でもハード依存っぽい事説明に書いてあるし使ったことないしで詳しくは知らない(´・ω・`)

843 名前:デフォルトの名無しさん :05/02/09 22:11:26
>>841
液晶CRTはヨドバシカメラにたくさん売られていますよ。

844 名前:デフォルトの名無しさん :05/02/09 22:26:15
液晶のカソードって・・・

845 名前:デフォルトの名無しさん :05/02/09 22:27:29
PerformanceCounterだけど、rdtsc使っている場合で、
動的にCPUのクロックが変わったときに、Frequencyの方は
古いまま、という問題があったようなきがする。

846 名前:デフォルトの名無しさん :05/02/10 01:36:51
知人は、未だに空ループさせる事で時間調整してたりします。(タイマー使うの面倒なら、せめてsleep使えよ)
ハードの性能がちょっと変わっただけで使い物にならなくなるソフト……

847 名前:デフォルトの名無しさん :05/02/10 02:08:18
確か、Sleep(0)は意味があったよな。
CPUの独占使用を放棄して他のスッドレに処理を行う機会を与えるらしいが。

848 名前:デフォルトの名無しさん :05/02/10 02:19:38
Sleep(0)は現在割り当てられているタイムスライスの残りを放棄する。
が、他にアクティブなスレッドが存在しなければ即座にまた戻ってきて、
結果的にスレッド切り替えのコストだけを浪費することになる。

849 名前:デフォルトの名無しさん :05/02/10 02:36:26
>>848
アクティブなスレッドがないんなら、別にCPU時間を浪費してもいいじゃん。
空ループの離脱条件成立が遅れるなどの副作用はあるだろうけどさ。

850 名前:デフォルトの名無しさん :05/02/10 03:03:37
ヤダヤダ!そんなのヤダ!

851 名前:デフォルトの名無しさん :05/02/10 04:07:14
ループ中にSleep(0)を入れて効果を実感出来た試しがない。

852 名前:デフォルトの名無しさん :05/02/10 04:11:47
実感しまくり。まあ素人はSleep(1)でもしてなさいってこった。

853 名前:デフォルトの名無しさん :05/02/10 07:02:42
ウィンドウズのタスクマネージャみたいに現在稼動してるプロセスを一覧表示するにはどうしたらいいですか教えてください

854 名前:デフォルトの名無しさん :05/02/10 08:16:57
EnumProcess

855 名前:デフォルトの名無しさん :05/02/10 11:56:38
Sleep(0)するくらいなら、スレッドのプライオリティを下げる.。

856 名前:デフォルトの名無しさん :05/02/10 12:12:10
ハンドルからそのウィンドウのサイズを取得するAPIを教えてくださ

857 名前:デフォルトの名無しさん :05/02/10 12:16:12
GetWindowRect

858 名前:デフォルトの名無しさん :05/02/10 12:22:55
>>857
ありがd

859 名前:デフォルトの名無しさん :05/02/10 17:24:05
>>849
CPU使用率が100%のままだとファンがうるさくなったりするらしい。
俺のボロPCには関係ないけど。

860 名前:デフォルトの名無しさん :05/02/10 17:52:49
>>848
アクティブなスレッドが存在しないときはスレッドを切り替える必要が無いのだから、
切り替える先があるかどうか調べればいいだけなんだからそんなにコストは高くないだろ。


861 名前:デフォルトの名無しさん :05/02/10 17:57:11
マルチスレッド組んでてSleep()使ってると同期取り忘れてること見落とすんだよねぇ…
俺はマルチスレッド使うときはSleep()使わんようにしてる。

862 名前:デフォルトの名無しさん :05/02/10 18:09:07
見落とさなけりゃいいだろ

863 名前:デフォルトの名無しさん :05/02/10 18:11:47
うわー・・・

864 名前:デフォルトの名無しさん :05/02/10 18:17:04
なんかSleepが悪者扱いされとる。
使いかたが変なやつがバカだけなのに

865 名前:デフォルトの名無しさん :05/02/10 18:20:05
>>864も馬鹿確定

866 名前:デフォルトの名無しさん :05/02/10 22:10:13
しかし理由は説明できない>>865さんでした。

867 名前:デフォルトの名無しさん :05/02/10 22:58:21
>>864
というか、他人のソース見てたら、
「ここでSleep(1)しておくとうまく動く」
とかいうコメントが書いてあって呆れた。

868 名前:デフォルトの名無しさん :05/02/10 23:05:28
>>866 説明不要の馬鹿

869 名前:デフォルトの名無しさん :05/02/10 23:16:51
>>868
その理由も説明できなオバカさん発見

870 名前:デフォルトの名無しさん :05/02/10 23:17:34
>>867
そんなことは今関係ない。

871 名前:デフォルトの名無しさん :05/02/10 23:17:51
Sleep(1)を入れるとうまく動くつーの、経験したこと有るな。
まぁ、納得いかなかったので、調べまくって修正したが。

872 名前:デフォルトの名無しさん :05/02/11 00:12:47
説明できないヴァカと
説明不要のヴァカを
両方まとめて晒しage

873 名前:デフォルトの名無しさん :05/02/11 00:41:26
>>872
後者

874 名前:デフォルトの名無しさん :05/02/11 01:51:47
Sleep(1)を入れるとうまく動くつーのは
自分より低い優先度のスレッドに実行機会が与えられるから。

875 名前:デフォルトの名無しさん :05/02/11 04:03:17
フルスクリーン表示にしたいのですがどうすればいいのですか?

876 名前:デフォルトの名無しさん :05/02/11 04:11:03
>>875
画面の大きさをしらべて、ウィンドウのサイズを最大にする

877 名前:デフォルトの名無しさん :05/02/11 09:46:49
SetWindowLong(hWnd, GWL_STYLE, WS_POPUPWINDOW);
ShowWindow(hWnd, SW_SHOWMAXIMIZED);

でも戻し方がわからない・・・誰か教えてくれたらありがたいです

878 名前:デフォルトの名無しさん :05/02/11 10:33:25
質問ですが、
システムカラーを得るには、GetSysColorですが、
システムで使われてるフォント名を得たい場合はどうすればいいのでしょうか?

879 名前:デフォルトの名無しさん :05/02/11 10:45:45
SystemParametersInfo

880 名前:デフォルトの名無しさん :05/02/11 11:02:34
質問

GetTextExtentを使って、デバイスコンテキストでの文字列の長さを得たんですが、
なんか微妙に異なるんですよね。

GetTextExtentを呼び出す前にデバイスコンテキストに設定するのは、フォントだけで問題ないですよね?
何か他にあります?

881 名前:デフォルトの名無しさん :05/02/11 11:09:25
>>875
ゲームでフルスクリーンならChangeDisplaySettings()

882 名前:デフォルトの名無しさん :05/02/11 11:17:35
>>878
SystemParametersInfoでフォント名は得られない。
確か、別な方法があったはず。

883 名前:デフォルトの名無しさん :05/02/11 11:39:01
EnumFontFamilies

884 名前:デフォルトの名無しさん :05/02/11 12:02:40
>>880
GetTextExtentなんてAPIはWin32にはないよ

885 名前:880 :05/02/11 12:04:43
自己解決
スマソ

886 名前:デフォルトの名無しさん :05/02/11 12:40:18
学生プログラマなのですがよろしくお願いします
LocalLockがよくわからないのですが
私の予想では
LocalLockとは別のメモリ空間にあるデータの先頭アドレスを
自分のメモリ空間のポインタとして扱えるようにするでOKですか?

887 名前:デフォルトの名無しさん :05/02/11 12:46:48
いやWin3の場合、ローカル移動可能メモリを移動不可能にして
そのメモリのポインタを取得する。

888 名前:デフォルトの名無しさん :05/02/11 13:12:16
>>887
回答ありがとうございます

調べてみたのですが固定メモリと移動可能メモリがあるんですね、
まだまだ勉強がたりないようです orz

889 名前:デフォルトの名無しさん :05/02/11 13:29:01
APIの質問ではないかもしれないのですが

CSVファイルを開いて
そこから色々とやっていきたいのですが

例えば
CSVに
東店,12000,300000
西店,5000,9000
という物が保存されていたき
コレを参照したいときはやはりバイト数などで出すしかないのでしょうか?
それとも何かいい関数などあるのでしょうか?



890 名前:デフォルトの名無しさん :05/02/11 13:33:18
宿題スレがお似合いかもしれん

891 名前:デフォルトの名無しさん :05/02/11 13:33:51
strtokで分割してやればいいんでない?

892 名前:デフォルトの名無しさん :05/02/11 13:36:46
>>881
普通はIDirectDraw::SetDisplayModeじゃないか?

893 名前:デフォルトの名無しさん :05/02/11 13:40:02
>>890
サンクス ちょっといってきます



894 名前:デフォルトの名無しさん :05/02/11 13:40:36
>>889
>東店,12000,300000
>西店,5000,9000

上記みたいに単純な形式ならばstrtok()が使えるけど、
実はCSVには少し複雑なルールがあったりするので、
結局は自力で解析処理を書くことになる。

895 名前:デフォルトの名無しさん :05/02/11 13:44:08
CSVあたりはクラス自作しとくと便利

896 名前:デフォルトの名無しさん :05/02/11 13:52:07
宿題スレはなんか雰囲気が違いました

もうちょっと詳しく書いてみますと
CSVまたはDATファイルの中が

日付,店舗ID,売り上げ,目標の順番になっていて
20040101,01,12000,30000
20040102,01,20000,21000
毎回決まった形となっているのですが

バイト数で考えると難しそうなので
例えば配列を用意しておいてa[3]
最初の , が来るまではa[0]に代入
次の , が来るまではa[1]に代入・・・・・・a[3]に代入
としていこうかと考えているのですが

ファイルを開いてからどのような関数で , などを認識し
やっていけばいいのか見当もつかない状態になっています
もっといい方法もあると思うのですが私が考えれるのはこのくらいでして

strtok()で同じようなことが出来るでしょうか?


897 名前:デフォルトの名無しさん :05/02/11 13:53:27
fgetc

898 名前:デフォルトの名無しさん :05/02/11 13:57:40
つうかCのスレで聞けば?

899 名前:デフォルトの名無しさん :05/02/11 14:19:49
>>896
Cの標準関数で普通にできるだろ。
標準関数群はOSごとのAPIの差異を吸収してどのOSでも共通のインタフェースで使えるようにしてるんだから。

900 名前:デフォルトの名無しさん :05/02/11 14:24:54
店舗ID,店舗名

01,"店舗1"
02,"店舗2, (改装中)"
03,"店舗3"

901 名前:デフォルトの名無しさん :05/02/11 14:26:39
APIとどう関係あるんだか

902 名前:デフォルトの名無しさん :05/02/11 14:38:17
DB系のAPIまで視野に入れれば、CSVの扱いもAPIで済みますがな

903 名前:デフォルトの名無しさん :05/02/11 14:41:58
カーネルサービス付近にしといてくださいな

904 名前:デフォルトの名無しさん :05/02/11 15:12:50
あの〜最初から最大化で、そのあとウィンドウのサイズを変えられないようにしたいのですがどうすればいいのですか??

905 名前:デフォルトの名無しさん :05/02/11 16:29:02
ODBCドライバでCSV用ドライバがたしか入ってるが
まあ、CSVだけのためにそんなことする人もあまりいないだろうが・・・
DBのデータをCSV出力したい場合とかは便利なのかな?

>>904
サイズ変更系ボタンつかないスタイルで作って最初から最大化で表示させればよいだけでは?

906 名前:904 :05/02/11 16:58:52
>>905
そうなんですが、それの記述方法が分からなくて・・・・。

あと、普通に画像を表示させると、ちらつくので、ちらつかなくするには、CreateCompatibleDCとCreateCompatibleBitmapを使うことは分かったのですが、
どのように書けばいいのですか?
サンプルソースなどがあるサイトしりませんか?

907 名前:デフォルトの名無しさん :05/02/11 17:03:21
オフスクリーンでビットマップを操作して、
PaintイベントでBitBlt

908 名前:デフォルトの名無しさん :05/02/11 17:17:47
>>904
サイズ不変は、表示する時に^ WS_MAXIMIZEBOX ^ WS_THICKFRAME。
最大化は分からない。

909 名前:908 :05/02/11 17:19:27
あっ、通常のサイズ限定でのサイズ不変かも。

910 名前:デフォルトの名無しさん :05/02/11 17:27:25
CreateCompatibleDCしてCreateCompatibleBitmapしてSelectObject。
WM_PAINTはGetClipBoxして↑のをBitBlt。

911 名前:デフォルトの名無しさん :05/02/11 19:17:11
〜ハンドル型ってほとんどポインタですか?

912 名前:デフォルトの名無しさん :05/02/11 19:17:54
はい

913 名前:デフォルトの名無しさん :05/02/11 19:18:09
ハンドルとポインタは全く違いますが?

914 名前:デフォルトの名無しさん :05/02/11 19:20:26
値は同じです

915 名前:デフォルトの名無しさん :05/02/11 19:42:58
ポインタは数字なんだからintですよね?

916 名前:デフォルトの名無しさん :05/02/11 19:47:04
実体が分かっているなら良いです。好きにキャストしてよいです

917 名前:デフォルトの名無しさん :05/02/11 19:59:19
typedef void *HANDLE;

918 名前:450 :05/02/11 20:01:13
先日質問した>>450 のプログラムなんですが、
>>462 さんの示したようなパターンでマルチスレッドにしてみました。
通信スレッド -> UI スレッド: PostThreadMessage
UI スレッド -> 通信スレッド: PostMessage
ワーカースレッド -> 通信スレッド: PostThreadmessage
通信スレッド -> ワーカースレッド: SetEvent (通信終了の指示用)
この時ワーカースレッドは基本的に通信スレッドにメッセージを飛ばして
送信をさせるのみ。通信が切断したことを示す SetEvent のみを監視。

という構成でやっているのですが、ワーカースレッドの速度が激減してしまいました。
数10byte〜数100byte 程度の小さなデータを大量に送っている為なのでしょうか?
それとも使用している同期・メッセージ手段がマズいのでしょうか?

ワーカースレッドのループの中で Sleep(1) を入れると極端に遅くなる。
ワーカースレッドのループの中で Sleep(0) を入れると Sleep(0) よりは速いがやはり遅い。
しかも、データがちゃんと飛ばずに漏れているっぽい。

919 名前:450 :05/02/11 20:03:59
>通信スレッド -> UI スレッド: PostThreadMessage
>UI スレッド -> 通信スレッド: PostMessage

これは逆でした。

通信スレッド -> UI スレッド: PostMessage
UI スレッド -> 通信スレッド: PostThreadMessage


920 名前:デフォルトの名無しさん :05/02/11 20:10:24
つうか、せっかくスレッドみたいなメモリ共有も不要な軽い機構使ってるのに
メッセージのやり取り必要なのか?

921 名前:デフォルトの名無しさん :05/02/11 20:36:41
>>450
ってさあ、メインループでpeekmessage()でメッセージが無いときに
framemove()に飛ばすとすると・・・
・・・それで何か足りないものってありますか?

922 名前:デフォルトの名無しさん :05/02/11 20:46:10
450?

923 名前:デフォルトの名無しさん :05/02/11 20:49:51
450

924 名前:デフォルトの名無しさん :05/02/11 20:52:11
結局、メッセージでシリアライズしてると言うこと?
スレッドの意味無いじゃんw

925 名前:921 :05/02/11 20:52:13
>>922
長時間処理がしたいとの事のようなので
framemoveで何が足りないのかと・・・
framemove1回ごとにforループを1000回ずつ回す事を考えると
それで長時間処理が出来てんじゃないという事を言いたかったのです。

926 名前:デフォルトの名無しさん :05/02/11 20:55:59
そりゃまずいよ

927 名前:450 :05/02/11 21:05:35
ぐぐってみたのですが、DirectX に FrameMove というのが見当たりましたけどそれのことですか?
もしそうなら、DirectX を使っていないので私のプログラムには使えなさそうです。

>>924
シリアライズ・・・Java の Serialize とかですか?
でもあれはスレッドの話とは違ったような・・・。

そうじゃなくてスレッドとスレッド同期が多すぎるという事でしょうか?
どんな同期手段でも、同期の数が多すぎるといけないのか、
それとも Message 以外の適切な手段を選べばちょっとくらい多くても問題がないのか・・・。

928 名前:デフォルトの名無しさん :05/02/11 21:08:49
>>918
ところで、メインスレッドはどこいった?

ついでに、一つのアプリケーション内なら、わざわざメッセージで投げる必要はないと思うが・・・

929 名前:デフォルトの名無しさん :05/02/11 21:22:10
>>927
すまん、共有リソースがある場合、スレッドセーフじゃないリソースをアクセス
すると時は、時間はかかるがメッセージを使ってメインスレッドで安全に
シリアルに処理させるということ。

930 名前:450 :05/02/11 22:56:49
UI スレッド = メインスレッドです。
メインスレッドが通信先と通信を開始すると _beginthread でスレッドを起動、
接続が完了すれば、メインスレッドに接続した旨をメッセージで伝えています。
その後は、UI 側がデータを送信したい時は PostThreadMessage で通信スレに指示、
通信先からデータが来た場合には、メインスレッドにデータ受信メッセージを送ります。
時々長時間処理が必要になって、その場合は新たにワーカースレッドが作成されて、
そのスレッドが一方的に通信スレッドに PostThreadMessage で送信データを指示しています。
ワーカースレッドは接続が途絶えた事のみを検知しています。

メッセージは遅いんですね。CriticalSection とかを使って処理したほうがいいのか。
でも、処理が楽だし、UI を記述するのと同様に出来るのが楽なんですが・・・。

UI スレッドが何らかのメッセージを受け取るのと同じような処理をする場合は
どうしていますか?WM_TIMER で CriticalSection の中を監視?


931 名前:デフォルトの名無しさん :05/02/11 23:09:25
WM_CREATEを
hdc=GetDC(hwnd);
hmainwndsubdc=CreateCompatibleDC(hdc);
hmainwndsubbmp=CreateCompatibleBitmap(hdc,640,480);
ReleaseDC(hwnd,hdc);
SelectObject(hmainwndsubdc,hmainwndsubbmp);
TextOut(hmainwndsubdc,0,0,"ほげほげ",8);
として
WM_PAINTを
hdc=BeginPaint(hwnd,&pt);
BitBlt(hdc,0,0,640,480,hmainwndsubdc,0,0,SRCCOPY);
EndPaint(hwnd,&pt);
にするとウインドウが一面黒くなってしまうんだが、白くするにはどうすればいいのでしょうか?

932 名前:デフォルトの名無しさん :05/02/11 23:11:02
文字の部分だけは周りが白くなってあとは真っ黒です。

933 名前:デフォルトの名無しさん :05/02/11 23:15:42
オバキュー

934 名前:デフォルトの名無しさん :05/02/11 23:21:42
>>930
人間が使うプログラムならメッセージでもそんなに人間がかんじられるほど
遅くなることはありません。
いまいち処理が分からんので、回答できない。

935 名前:450 :05/02/11 23:37:24
基本的には人間が使うプログラムなんですが、
一部のデータは大量に送られてきます。
現時点では全部のデータが一度メッセージ経由で UI に送られています。

全部をメッセージ以外の軽い手段でやりとりするか、
通信スレッドがデータを確認してその大量のデータだけ軽い手段でやるかで悩んでいます。
前者の場合だと、>>930 の最後の行に書いた通り、UI スレッドが受け取る手段が問題になりますし、
後者は後者で面倒が多いなと思っている所です。


936 名前:デフォルトの名無しさん :05/02/11 23:40:22
>>931
TextOutの前に塗り潰しておく。
FillRectでもPatBltでもSetPixelでもお好きなように。

937 名前:デフォルトの名無しさん :05/02/11 23:42:41
ExtTextOut最強。

938 名前:デフォルトの名無しさん :05/02/11 23:46:16
>>936
ありがddd

939 名前:800 :05/02/12 11:23:10
自己解決

940 名前:デフォルトの名無しさん :05/02/12 13:35:42
>>450
>>918
>>930

ちょっとそこまでくるとソース全部見ないと相談されてもなんともいえないね。
とりあえずデバッグ出力あたりに処理毎に現在時刻と処理場所とか出力して
どこで遅くなっているか調べるのをおすすめする。
まず原因調べないとね。


一応今までの説明で遅くなりそうな点を書いとくと。(全然関係ないかもしれんが)

1:メッセージをUIスレッドに送信、またはUIスレッドから受信する箇所で遅延?
メッセージは通常のUIのメッセージ(WM_PAINTその他全部)と同じルートを使う為、
メッセージ量が多めであるUIスレッドを経由するとそこで待ち時間がでる可能性がある。
といっても通常は問題にならない。
しかし、UIのつくりそのものがおかしくて重い可能性もあるので一応。(闇雲にInvalidateRectとか)

2:通信スレッド・ワーカースレッドで無茶な処理をしていないか?
Sleep(0),Sleep(1)って言葉が出てきたので気になったんだが、
特に処理がない状態の場合に無限ループ的にまわしてたりしてないかな?

スレッド慣れてない人がたまにやるんだけど、「無限ループ的な待ち」は
スレッド使おうが使うまいが最低最悪の処理なので注意。

941 名前:デフォルトの名無しさん :05/02/12 15:04:24
無限ループ使いはウィルス作者並みに取り締まるべきだろ。

942 名前:デフォルトの名無しさん :05/02/12 15:24:51
C言語で構造化例外処理を扱うにはどうすればよいのですか。

943 名前:デフォルトの名無しさん :05/02/12 15:33:33
MSDNを読めばよい

944 名前:デフォルトの名無しさん :05/02/12 17:14:15
文字の表示は出来るんですが、数字の表示(足したり引いたりした物の表示)ができません・・・・・

どうすればいいのですか?

945 名前:450 :05/02/12 17:20:29
1. UI 自体は特に重たくはなっていないようです。データのやりとりだけが遅いんです。
でも、UI のチューニングを特にしていないので
メッセージが多いとか、処理が重いとかはあるかもしれません。

2. ワーカースレッドは 100byte 未満の 10000 個のデータを送信しています。
始めにタイムアウト 0 の WaitForSingleObject で切断検知をして問題なければ、
データを PostThreadMessage で送信するというループです。
このループの末尾に、Sleep を入れてみたりしたのですが・・・。

通信スレッドは、タイムアウト 0 の WaitForSingleObject で
WSAEventSelect をチェックしてソケットからの読み出しを行い
データが揃えば UI スレッドにメッセージを送信し、
PeekMessage でメッセージを確認して、来ていたらソケットへ送信を行います。
これをループとして回していました。

とりあえず UI/ワーカーから通信スレへの送信要求をメッセージではなく
CriticalSection を使った物に変えてみました。
PeekMessage のところをクリティカルセクション経由で
バッファにデータが溜っていたら送信という風にしています。

この改変と通信処理の別の部分の見直しで多少改善したようです。
データのやりとりの速度が多少マシになって、>>918 で書いた
データが途中で詰まって、ちゃんと来ない現象はなくなりました。

946 名前:デフォルトの名無しさん :05/02/12 17:26:50
>944
wsprintf(buf,"%d点",n);

947 名前:デフォルトの名無しさん :05/02/12 17:29:54
>>944
もっと具体的に。
それから、本当にこのスレ向けなのか?

http://pc5.2ch.net/test/read.cgi/tech/1104843249/
http://pc5.2ch.net/test/read.cgi/tech/1096848771/
http://pc5.2ch.net/test/read.cgi/tech/1107926989/
http://pc5.2ch.net/test/read.cgi/tech/1031374980/
http://pc5.2ch.net/test/read.cgi/tech/1101931660/

948 名前:デフォルトの名無しさん :05/02/12 17:38:10
どんなスレッド(通信なども)も全部UIにして、スレッド間通信をすべて
メッセージでやってるDQNコードは見たことあるな。

949 名前:デフォルトの名無しさん :05/02/12 18:02:24
GetDC()で取得したハンドルは描画が終了したらReleaseDC()で
解放しなければなら無いらしいんですが

描画するたびに
GetDC();
//描画
ReleaseDC();
ってやら無ければダメなんでしょうか?

WM_DESTROYを受け取ったときにプロシージャでReleaseDC()とか無理でしょうか?

950 名前:デフォルトの名無しさん :05/02/12 18:12:29
次スレ
http://pc5.2ch.net/test/read.cgi/tech/1108199304/

951 名前:デフォルトの名無しさん :05/02/12 18:29:36
>>945
やっぱり見ないとなんとも言えんけど所々気になるところが・・・

>2. ワーカースレッドは 100byte 未満の 10000 個のデータを送信しています。
>始めにタイムアウト 0 の WaitForSingleObject で切断検知をして問題なければ、
>データを PostThreadMessage で送信するというループです。

メッセージ連続10000往復以上は確実に遅くなると思われるのでとりあえずメッセージ回数軽減したほうがよさげ。ってこれはもう改善済みかな?
タイムアウト 0 の WaitForSingleObjectでの切断検知ってのはデータが既にある場合の事で
データがない場合はWaitFor...系でウエイトしてるって事でいいのかな?
データない場合もタイムアウト0のWaitForSingleObjectでループしてたら送信していない以上送信速度に影響ないだろうが設計的にかなりいかんよ。

>通信スレッドは、タイムアウト 0 の WaitForSingleObject で
>WSAEventSelect をチェックしてソケットからの読み出しを行い

これがいまいちよく理解出来ないんだけどWSAEventSelect使ってるのにタイムアウト0のWaitFor...?

>PeekMessage のところをクリティカルセクション経由で
>バッファにデータが溜っていたら送信という風にしています。
これもいまいちよくわからん。
もしかして
while(bConnect){
  EnterCriticalSection
  if(BufSize){
    Send();
  }
  LeaveCriticalSection
}
こんな感じでやってる?

説明見てて感じるんだけどスレッドとかWaitFor..系とかイベントオブジェクト
あまり使った事ないように見えるけどそうかな?だとしたらまずその辺から使い方調べた方がいいかも。

952 名前:デフォルトの名無しさん :05/02/12 18:38:50
>>949
だめです

953 名前:デフォルトの名無しさん :05/02/12 18:51:14
>>949
大丈夫です

954 名前:951 :05/02/12 18:51:59
>>945
951で色々書いたがもしちゃんとわかってての話であれば951は聞き流してくれ。
お互い掲示板じゃそこまで細かくかけないしね(´・ω・`)

955 名前:450 :05/02/12 18:57:24
>メッセージ連続10000往復以上は確実に遅くなると思われるのでとりあえずメッセージ回数軽減したほうがよさげ。ってこれはもう改善済みかな?
送信側だけ CriticalSection とバッファを使っています。

>タイムアウト 0 の WaitForSingleObjectでの切断検知ってのはデータが既にある場合の事で
>データがない場合はWaitFor...系でウエイトしてるって事でいいのかな?
データがなくなればスレッドが終了しますので、
データが無い場合でもループが回っているという事はないです。

>説明見てて感じるんだけどスレッドとかWaitFor..系とかイベントオブジェクト
>あまり使った事ないように見えるけどそうかな?だとしたらまずその辺から使い方調べた方がいいかも。
API の仕様はなんとかわかってはいる(と思う)んですが、経験が少なくて・・・。

>こんな感じでやってる?
CriticalSection からの送信要求の読み出しはそうですね。

for(;;){
  if(WaitForSingleObject==WAIT_OBJECT_0){
    読み込み処理;必要なデータが揃えば UI スレッドにメッセージ送信;
    ※読み込み時に通信切断もチェック
  }
  EnterCriticalSection
  if(BufSize){
    Send();
  }
  LeaveCriticalSection
}

送信要求もイベントを立てるようにして WaitForMultipleObjects を使って、
かつタイムアウトを 0 以上の値にした方がいいって事でしょうか。

956 名前:デフォルトの名無しさん :05/02/12 19:00:29
>949
それが嫌になったらC++にしな

957 名前:951 :05/02/12 19:16:02
んと、わかってるのであれば聞き流してもらうって事で。
通りすがりのスレッド初心者に役に立つかもしれないし、一応スレッド関連の基本を以下に書くと。

1:特定のスレッドでWaitFor..系(あるいはSleep)使ってウエイト状態にしている場合、
そのスレッドは全く存在していないのと同じように扱われCPUその他リソースを消費しない。※

具体的には
「スレッドA」UI処理
「スレッドB」for(;;)やwhile(bFlag)みたいに無限ループでフラグチェックなりをしていた場合。
CPUパワーの最大を100%とすると、
「スレッドA」CPU50%使用
「スレッドB」CPU50%使用
という状態になり、スレッドBで内容的には大した処理を行っていないにもかかわらずスレッドAは50%しか力を発揮できない。※
しかもスレッドBは常にフルパワーで動作することになるので、全く別のアプリケーションの動作にも影響が出てしまう場合もある。※

でも、
「スレッドA」UI処理
「スレッドB」WaitForSingleObject(hEvent, INFINITE)のようにした場合。
スレッドBはWaitFor..で完全に停止してるわけだけどこの場合
「スレッドA」CPU100%使用
「スレッドB」CPU0%使用
ということになり、スレッドAはフルに資源を活用できる。※

つまり、特に用がなければスレッドは出来る限りWaitFor..等で待機しておくのが望ましいというか普通という事になる。


※厳密に言えば大嘘だらけになるが、概念をわかりやすく説明する為にあえて大嘘ついております。

958 名前:デフォルトの名無しさん :05/02/12 19:24:49
非可視のウインドウを持ったUIスレッドを作りまくる奴いるよね。
ワケワカラン

959 名前:デフォルトの名無しさん :05/02/12 19:24:53
>957
説明をダウンサイジングして用語を標準化してくれる?

960 名前:デフォルトの名無しさん :05/02/12 19:25:07
c++にて、Write/GetPrivateProfileStringを使ってるんですが
日本語(text=hogeホゲ のような)データは扱えないんでしょうか?
文字化けしてしまうのですが…

961 名前:デフォルトの名無しさん :05/02/12 19:26:45
>956
MFCってことでしょうか?
C++を使ったwinプログラムって他にもありますか?

962 名前:デフォルトの名無しさん :05/02/12 19:34:02
>960
UTF-16にしてバイナリ扱いにすれば?
Get..Struct

963 名前:951 :05/02/12 19:34:17
つづき

んで、WaitForを活用する為に一番使われ、使いやすいのがイベントオブジェクト(CreateEventで作るやつね。)
イベントオブジェクトは文字通りイベントが起きたときに使う。
WaitForSingleObject([イベントオブジェクト], INFINITE)
とした場合イベントオブジェクトのイベントがOFF場合、WaitForSingleObject関数を抜けない。(そしてリソースを一切消費しない)※
イベントONになるとWaitForSingleObjectを抜けて次に進むことになる。

具体的な使用例を言うならば
開始時に
スレッドA(UI & メインスレッド)
スレッドB(作業スレッド)
を作成し、スレッドBではWaitFor..でウエイトさせておく。

UIの特定のボタンが押されたら特定のバッファにデータをデータを入れイベントをONにし、
後の処理はイベントONによって開放されたスレッドBが行う。(スレッドAはUI処理に戻る)

もうすこし具体的な使用例を書くならWaitForMultipleObjectsでの待機になるかな。
for(;;){
  Result = WaitForMultipleObjects // 「処理行えイベント」・「アプリ終了その他中断命令イベント」・「通信切断イベント」の三つで待機
  if(Result = XX){
    // WaitForMultipleObjects の戻り値でどのイベントがONになったかある程度判別可能なのでイベントにそった処理を行う
  }
}
このようにスレッドはWaitFor...とイベントその他を活用すれば資源を無駄にせずに有益に使用できる。※

964 名前:デフォルトの名無しさん :05/02/12 19:49:17
>961
未チェック。
class MyDC{HDC hd_; HWND hw_;
public:MyDC(HWND hw):hw_(hw)
{hd_=GetDC(hw);}
~MyDC(){ReleaceDC(hw_,hd_);}
operator HDC(){return hd_;}
};

965 名前:951 :05/02/12 19:51:19
つづき
んで複数スレッドを使用した場合の問題として
BYTE cbData[255]
みたいなバッファがあった場合使い方によっては
スレッドAでcbDataにデータを入れている途中でスレッドBでcbDataからデータを読み出す、という自体が起こる。
当然データはむちゃくちゃになるし、それ以外のもっと深刻な問題も多数発生する。
そんな時に使うの「クリティカルセクション」これはデータ保護のために使用するものであって、
イベントやWaitFor等とは目的が全く異なるものになる。(というか使いにくいし、それ用にイベントとかその他があるのでそっちを使う)

具体的には
CRITICAL_SECTION CObj;
BYTE cbData[255]

Send()
{
  EnterCriticalSection(&CObj)
  // cbDataのデータを読み込み全て送信する
  LeaveCriticalSection(&CObj)
}

Recv()
{
  EnterCriticalSection(&CObj)
  // ○○からもってきたデータをcbDataに全て格納する
  LeaveCriticalSection(&CObj)
}
としておけば。
スレッドAでSend()スレッドBでRecv()が同時に発生した場合、動作的には
先にEnterCriticalSectionに入った方のスレッド処理が行われ、後からEnterCriticalSectionnに入ったスレッドは先EnterCriticalSectionに入ったスレッドが
LeaveCriticalSectionするまでEnterCriticalSectionnでウエイト状態になる。
結果として、cbDataは一つのスレッドしかアクセスしないように出来るという事になり、安全になる。

966 名前:デフォルトの名無しさん :05/02/12 19:58:42
>965
そんなベタな説明するくらいなら自分のホムペに書け。マジで邪魔だ

967 名前:951 :05/02/12 20:00:18
長すぎるしなんか方向ずれてきたのでやめておくね orz

968 名前:951 :05/02/12 20:06:49
>>966

>>955のループの使い方だと結局無限ループ的動作になるって事が言いたかったのorz
クリティカルセクションがデータ保護だけではなくてイベント&WaitFor..待機的目的で使われてるように見えたので・・・

取りあえず教は寝ます。ごめんねorz

969 名前:デフォルトの名無しさん :05/02/12 20:15:43
>>958
Winsockの立場はどうなる?

970 名前:951 :05/02/12 20:17:45
最後って言ったけどもう一個だけ、このままだと450氏用になんの役にも立たないのでorz

1:送信回数を減らすことによって処理を早くする為に
100byte以下を10000回送信する部分を可能であれば一つにまとめて送信する。
大き目のバッファに溜め込んでおいて実際には送信せずそのバッファに入れるだけ。
バッファが満杯になったらイベントを立て、実際の送信処理を行わせる。

2:実際の送信部分の
if(BufSize){
  Send();
}

Waitfor...(バッファ満杯イベント)
Send()
のようにうまいこと改造する。

こんだけでもかなり変わるはず。今度こそ最後です、orz ドゲザ

971 名前:デフォルトの名無しさん :05/02/12 20:20:44
>>969
WinSockの2.0はイベントでやりとりするっしょ。
メッセージでやり取りするのは、Win16の遺物であるWinSock1.1

972 名前:デフォルトの名無しさん :05/02/12 20:24:28
InterlockedIncrementとInterlockedDecrement APIは、
特定のリソースの排他制御に適する。
TryEnterCriticalSectionも見よ。

973 名前:デフォルトの名無しさん :05/02/12 20:27:49
>>945
>2. ワーカースレッドは 100byte 未満の 10000 個のデータを送信しています。
 数が多すぎる問題は当然として、
 こんだけ多いなら、ワーカースレッドからそのまま通信したほうがよくないか?


974 名前:デフォルトの名無しさん :05/02/12 20:37:08
>>971
耳学問?
実用のWinscokプログラムの経験ないのかな。

975 名前:デフォルトの名無しさん :05/02/12 20:38:25
>>974
メッセージでI/O完了ポートを使えるのか。初耳で砂。

976 名前:デフォルトの名無しさん :05/02/12 20:41:50
WSAEventSelectを知らない爺さんがいるな。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsaeventselect_2.asp

977 名前:(・∀・)ニヤニヤ :05/02/12 20:46:53
>>976
ひょっとしてイベントが同時に待機できる最大数を知らないの?

978 名前:デフォルトの名無しさん :05/02/12 20:50:52
「よりによってWSAEventSelect()を引き合いに出すとは厨丸出しだな。」
と言うのはみっともないから我慢しようかと思ったが、我慢が体に悪いので言うことにしました。

厨丸出しだな。

979 名前:デフォルトの名無しさん :05/02/12 20:52:17
そこでI/O完了ポートですよ。

980 名前:デフォルトの名無しさん :05/02/12 20:55:37
一行レスで、HNもなく、IDもないと、
誰が、どういう立場にたって、知識をどういう方向で使おうとして発言してるのかわからない。


981 名前:デフォルトの名無しさん :05/02/12 20:56:39
MFCのCAsyncSocketを黙殺する>>976は稀有な存在。

982 名前:デフォルトの名無しさん :05/02/12 20:57:36
I/O完了ポートって、ハンドル数の制限あったっけ?

983 名前:デフォルトの名無しさん :05/02/12 21:01:31
>>982
WaitForで待つなら、Win4までだと64。
APCだと関係ないな。

984 名前:デフォルトの名無しさん :05/02/12 21:26:59
サービスでウインドウを作りたくねえよなぁww

985 名前:デフォルトの名無しさん :05/02/12 21:34:44
>>951
(945とは違う人だけど)
これから学ぼうかと思ってた自分にとっては、こういう解説は有難かったり。

とまぁ、埋めついでに

986 名前:450 :05/02/12 22:30:05
>>951 さん
ありがとうございました。
色々と見直してみます。

>>I/O 完了ポート
ところで I/O 完了ポートに関しての初心者向けの説明・資料ってありませんか?
Winsock FAQ とかに名前は出てくるのですが、詳細が不明で・・・。
オーバーラップド I/O とか言うのもあるんでしたっけ・・・。


987 名前:69式フリーPG ◆hND3Lufios :05/02/12 22:33:34
>>986
http://www.amazon.co.jp/exec/obidos/ASIN/4756114040/qid=1108215142/sr=1-4/ref=sr_1_10_4/250-2853882-2300213

この本とか。。。マルチスレッドスレのほうで聞いてみるのも良いかも。

988 名前:デフォルトの名無しさん :05/02/12 23:26:54
char str[32];
wsprintf(str, "こんにちは");
TextOut(hdc,0,0,str,strlen(str));

と書いてビルドすると、
TextOut(hdc,0,0,str,strlen(str));
上に対して
warning C4267: '関数' : 'size_t' から 'int' に変換しました。データが失われているかもしれません。
という警告が出ます
なぜなのでしょうか?

989 名前:デフォルトの名無しさん :05/02/12 23:27:02
インストーラが行っている処理について調べているのですが…
コントロールパネルの「プログラムの変更と削除」で表示されるプログラム一覧に
登録するためのAPI、もしくはそれを管理しているレジストリ等があれば教えてください。
どうぞよろしくお願いします。

990 名前:デフォルトの名無しさん :05/02/12 23:59:36
>>988
strlenの返り値型はsize_t、TextOutの引数型はint。
size_tからintに変換して、データが失われているかもしれないから。

991 名前:デフォルトの名無しさん :05/02/13 00:01:09
>988
strlenの戻り値はsize_tで
size_tはunsigned intの変名。
TextOutの第5引数はintだから、
キャストしなきゃ警告が出る。

992 名前:991 :05/02/13 00:02:35
むう、2分遅れか。orz

993 名前:デフォルトの名無しさん :05/02/13 01:22:43
>>990-991
返事ありがとうございます。
どういう風に直なおせばいいのですか??

994 名前:デフォルトの名無しさん :05/02/13 01:34:04
(int)strlen(str)

995 名前:デフォルトの名無しさん :05/02/13 01:35:58
>>994
あ、警告でなくなりました!
どうもありがとうございました。

996 名前:デフォルトの名無しさん :05/02/13 03:45:52
"c:\foo\bar\..\"を"c:\foo\"に変換する関数ってないですか?

997 名前:デフォルトの名無しさん :05/02/13 04:06:02
GetFullPathName で出来たと思う

998 名前:デフォルトの名無しさん :05/02/13 06:23:19
>>996
PathCanonicalize

999 名前:デフォルトの名無しさん :05/02/13 06:36:59
999

1000 名前:デフォルトの名無しさん :05/02/13 06:37:30
Win32API質問箱 Build28
http://pc5.2ch.net/test/read.cgi/tech/1108199304/l50


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.