• 締切済み

_beginthread でメインのキー操作に影響する

VC++ V6.0 MFC OwnerDrawボタン ダイアローグベースアプリケーション Win98/Win2000 でCreateThread でスレッドを作成していました。 Thread は while で回し、キャプチャ画像を取り込んでます。 しかし、MFCでは CreateThread API はマズイということなので _beginthread 変更しました。 Win98 環境下でCreateThread の時は問題ありませんでした。 しかし、_beginthread に変更したところ、スレッド開始で砂時計でキー操作ができなくなりました。 作ったスレッドは GetThreadPriority は THREAD_PRIORITY_NORMAL と返ってきます。 そこでTHREAD_PRIORITY_BELOW_NORMALに変更したところ、CreateThread で作ったスレッドと同じレベルのキー操作ができるようになりました。 しかし、処理速度が低く困ってます。 while ループでは20msぐらいの仕事なので 30ms で回るよう経過時間を測って Sleep を入れてあります。 よろしくお願いします。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

MFCではAfxBeginThradを推奨していたかと … スレッド起こす部分のコードを提示してみてはいかがでしょう メインスレッド側でWaitFor系のAPIでスレッド終了を監視していたりしませんか?

rannma
質問者

お礼

ありがとうございます。 ネットでMFCでのスレッドとして_beginthread(ex)を使う紹介例が多かったですけどね。 スレッドのループでは画像取り込みボードのドライバーをコールしてるのみで一般的でない関数なのでコードを示しても意味ないと思われます。 CreateThread の時とループ内のコードは同一です。 メイン側でWaitFor系の使用でスレッドの監視していません。 スレッド終了はスレッド側の終了処理で_endthread後に終了フラグをONにさせてメイン側はそのフラグを確認してます。 (終了要求のある時だけで、常にはメイン側でチェックしてません)

関連するQ&A

  • _beginthread関数の引数

    VC++ 2005 Win32コンソールアプリケーション で 1つ目のスレッドで「10」 2つ目のスレッドで「20」 3つ目のスレッドで「30」 と出力するために下記のように記述しました。 結果は予定通り出力されているのですが、 _beginthreadの第3引数の渡し方、 printfの引数の表示の仕方はこれでよいのでしょうか? void myThread(void *pParam); int arg[3] = {10, 20, 30}; int main() {   HANDLE hThread[3];   int i;   for (i = 0; i < 3; i++)   {     hThread[i] = (HANDLE)_beginthread(myThread, 0, &arg[i]);   }   /* 以下略 */ } void myThread(void *pParam) {   printf("%d\n", *(int *)pParam);   _endthread(); }

  • ハードウェアスレッドの割り当て方法

    ハードウェアスレッドがある環境で、win32APIを用いて、スレッドを特定のプロセッサに割り当てる方法を探してます。 イメージとしては.Netで言うところのThread.SetProcessorAffinityのようなものです。 ご存知の方、ご教授お願いします。 環境はXP,VC8です。

  • 特定のスレッドの破棄

    Win32 APIを使っています。 ソートの勉強の為に 右クリックでシャッフル、左クリックでソートするプログラムを作りました。 ソートをスレッドで行なっています。 ソート中に右クリックを押すとシャッフルと同時にスレッドを破棄したいと思ったのですが CreateThreadで作った特定のスレッドを破棄するにはどうしたらよいでしょうか? GetExitCodeThreadとExitThreadを使って破棄すると思い 試してみたらプログラム自体が閉じてしまいました。 タスクマネージャで確認したらプログラム自体はあってウィンドウは表示されてない状態になりました。

  • 別スレッドからメインダイアログのコントロールにアクセスする方法

    VC++2005 MFC WindowsXPを使用しています。 メインダイアログに作成したエディットボックスに フォーカスをセットしたいのですが、 別スレッドから行うにはどのようにすればよいのでしょうか? メインダイアログにあるボタンを押すと別スレッドの処理に入り、 その中でメインダイアログのコントロールを操作しようとしています。 //フォーカスをセット CWnd* MyEdit = ( CWnd* )this->GetDlgItem( IDC_EDIT1 ); MyEdit->SetFocus(); 宜しくお願い致します。

  • 独自INIファイルの操作をしたいんですが

    phpでaaa.iniの操作をしたいのですが 例えば [section] key1=aaaaa の「aaaaa」を書き換えたいのです。 (力量不足もありますが) 項目が複数あるので単純なfwriteでは対応できそうになく 出来れば win32apiのWritePrivateProfileStringのような 動かし方が出来ればいいのですが 読み込みは parse_ini_fileで出来そうなのですが 更新の方は方法が見つからなくて よろしくお願いします。

    • ベストアンサー
    • PHP
  • マルチスレッド間でデータ交換をする方法

    マルチスレッドの知識がないままに、プログラミングをする必要が出てしまったのですが、書籍などで調べても分からない部分があるため、質問いたします。 Win32APIを用いて(MFCは使用しない)、WindowsでVC7.0環境です。 やりたいことは、 スレッドAとスレッドBを生成し、 スレッドAの終了時点で、スレッドBがスレッドA内部で生成したクラスのインスタンスを取得するというものです。(もしくはその逆) スレッドAとB自体もクラスで構成しており、内部で生成されるインスタンスはグローバルではないため、スレッドBからスレッドAを見えるような仕組みが必要なのでしょうか?? まだイメージだけの段階で、ソースコードで表現できなくて申し訳ないのですが、簡単にご教授くださる方、もしくは参考になるサイトを教えてくださる方がいらっしゃいましたら、お願いいたします!

  • VC++ メインループでのイベント監視方法

    こんにちは。 VC++2008Expressでプログラムをしようと思っている初心者です。 以下、変な疑問があり、お尋ねしたいと思います。 よろしくお願いします。 Windowsアプリケーション Win32API クラスで別スレッドを作成して、そのスレッドからのイベントを WinMainループで受け取る方法ですが 通常皆様はどういう風にするのでしょうか? クラスは、その他のプログラムでも流用可能で様々なアプリに対応しやすいようにしあげたいのですが。。 別スレッドでイベント発生時にWinMainにどのように教えるのが普通のやり方なんでしょうか? 僕の考えでは、WinMain関数内のループ内で常時イベント発生していないか 以下のように監視させるか eventloop el; while(GetMessage(&msg,NULL,0,0)) {   TranslateMessage(&msg);   DispatchMessage(&msg);      if(el::boolEvent){     イベント処理へ   } } とするのが良いか? これだとクラスの関数、変数の使い方さえ分かるようにしておけば流用は簡単 なのかなと思いますが。。 メインのループ内にこんな監視を入れるようなプログラムをみたことないので ナンセンスなのではと思います。 次に考えられるのは、クラスのイベント発生で作成したSendMessageを送って メッセージ処理でイベント処理をさせるのが良いのかなって思いますが これだと、流用するときに対応したMessage(キュー?ですかね)を作成しないといけなく 私的に分かりにくいなーって思います。。。 変なことで悩んで先に進まないのですが、皆様はどのようにコーディングされるのでしょうか? ちなみにイベントというのは、RS232Cで受信があって、そのデータを加工したあとで メモリに格納して格納しましたよってイベントです。 どうかよろしくお願いします。

  • osx用のキー配列変更(キーマップィング)ソフトを探しています。

    synergy経由でwinキーボードでMacminiを操作してるんですが(かな入力) ゛キーを打ったら ふ と表示され -キー を打ったら へ と表示されます。win用 の「猫まねき」のような自由にキー配列を変更できるソフトはないでしょうか。 ご存知の方いらっしゃいましたら是非教えてください、よろしくお願いします。

    • ベストアンサー
    • Mac
  • WIN32API CreateFileのCOMx

    WIN32API CreateFile(…"COMx"…)のCOM番号「x」)は、1~256まで可能ですか。 MS-VC++でRS-232C通信のWIN32アプリケーションを作る必要が生じてきました。 VC++6.0やVS2005のシステムは所有していますが、WIN32アプリは初心者です。 (WIN32アプリが出来たらDLLに改造するつもりです。) http://www.saluteweb.net/~oss_winapi232.html ここにどなたかが、サンプルプログラムをアップされてます。 この中の("COM1")は、"COM1"~"COM256"まで、対応しているんでしょうか。

  • スレッドの終了を知りたい(WindowsAPI)

    CreateThread()で作成したスレッドの終了を知りたい (具体的には、スレッドが終了するまで待機したい)のですが、 うまくいかず困っています。WindowsAPIに関する本やネットで調べた ところ、WaitForSingleObject()が適用できると考え、 以下のようなプログラムを作成したのですが、 元のスレッドがWaitForSingleObject()のところで 止まると同時に、CreateThread()で作成されたThread_1()も 止まってしまいます。アドバイスいただけますでしょうか。 ----プログラム(該当部分)ここから---- DWORD Thread_1(LPVOID param) {  int i;  char buff[128];  /* iが99のときのみ終了してよい */  while(g_iFlg == 1)  {   for(i = 0; i < 100; i++)   {    Sleep(100);    wsprintf(buff, "%d", i);    SetDlgItemText((HWND)param, IDC_STATIC_1, buff);   }  }  ExitThread(0);  return 0; } BOOL CALLBACK Proc_2(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {  switch(uMsg)  {   case WM_INITDIALOG:    g_iFlg = 1;    g_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_1, (LPVOID)hDlg, 0, &g_dwThread);    return TRUE;   case WM_COMMAND:    switch(LOWORD(wParam))    {     case IDC_BUTTON_CANCEL:     case IDCANCEL:      g_iFlg = 0;      WaitForSingleObject(g_hThread, INFINITE);      CloseHandle(g_hThread);      EndDialog(hDlg, 0);      return TRUE;    }  }  return FALSE; } ----プログラム(該当部分)ここまで----

専門家に質問してみよう