• 締切済み

VBで新しいスレッド

VBのタイマーコントロールでリストの表示の更新を制御しているのですが、どうも重いので違うスレッドにしてスレッドの優先度を低くしようかと考えました。 しかしCreateThreadでスレッドを作成しようと思っても、必ず強制終了になってしまいます。 おそらくVBが複雑な変数管理構造を採っているからだと思います。 なんでもいいから新しいスレッドを作成する方法があったら教えてください。

みんなの回答

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

CreateThreadはマルチスレッド対応の言語でしか使用不可です。 VBは基本的にシングルスレッドの言語です。 ActiveXは別スレッドで動くようです。 人から聞いたことで、、、未確認ですが、、、

haporun
質問者

お礼

うーむ、ActiveXですか~。 自分で作ったActiveXカスタムコントロールは、別スレッドではないようです(笑。 ほかにも別スレッドで動きそうなコントロールを探しましたが、なかなか・・・。 VC++で作ったカスタムコントロールならできそうですが、そっちの知識は・・・。

関連するQ&A

  • スレッドについて

    スレッドについて、解らないのですが、 以下の文があると、1つのスレッドが終了するか終了しないかにかかわず、 次々とスレッドを立ち上げるものなんですか? いろいろな、APIでコントロール出来ると思いますが、 基本的には、次々とスレッドを立ち上げるものなんですか? 教えてください。 WM_CREATE: CreateThread(NULL,0,ThreadFunc,&A,0,&WID); CreateThread(NULL,0,ThreadFunc,&A,0,&WID); CreateThread(NULL,0,ThreadFunc,&A,0,&WID); CreateThread(NULL,0,ThreadFunc,&A,0,&WID); CreateThread(NULL,0,ThreadFunc,&A,0,&WID);

  • win32 スレッドのハンドルついて

    windowsのスレッドについての質問です。 今、手元にある書籍のスレッドを作る節にCreateThread()関数を使ってスレッドを作るサンプルプログラムが載っています。 その中では CloseHandle()関数が一切呼ばれていません。 しかも、そのサンプルではいくつもスレッドを作り、そのスレッドはプログラム中でいくつも終了するようなものです。CloseHandle()は呼び出さなくても問題ないのでしょうか? しかし、ネットで調べてみるとCloseHandle()を呼び出さなくてはいけないということが書かれていました。 http://www.daccho-it.com/program/WinApi/thread.htm ↑ 参考にしたサイト そこでいくつか質問です。 プロセスが終了するときにスレッドのハンドルは自動的に閉じられるという認識で大丈夫でしょうか? CreateThread()、_beginthreadex関数はCloseHandle()を呼び出す必要があるで大丈夫でしょうか? となると、CreateThread()の戻り値は必ず変数に保存しておく必要があるということですか? 書籍のサンプルではCreateThread()の戻り値はどこにも保存していませんでした、保存しない場合ハンドルが作られないってことはさすがにないですよね? よろしくお願いします。

  • スレッド処理内の変数の参照について

    大変困ってます。 今、親プロセスからスレッド内の変数に設定したいのですが方法がわかりません。 スレッドからの場合、普通行えばいいのでわかるのですが ・・・。 (詳細) メインプロセス(A) クリエートスレッド後のスレッド(B)  1.(A)で(B)をCreateThread  2.(A)の本処理で(B)の構造体にmemcpyの方法が    わかりません。  3.知っている方がいましたら教えていただけませんか。  4.読みずらい文章ですみません。宜しくお願いします。

  • VB2008で

    VB2008で System.Threading.Thread.Sleepを使って5秒後にテキストボックスにaと表示させるプログラムを作ろうとしましたが、うまくいなないため、タイマーコントロールを使用したいと思ったのですが、どのようにしたらいいでしょうか?

  • スレッドの終了を知りたい(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; } ----プログラム(該当部分)ここまで----

  • スレッドについて

    お世話様です。 Windowsのスレッドについて質問です。(WinXP C#.NET2003) 以下のようなコードでスレッドを作成した場合、どうなるのか教えてください。 private void BTN_input_Click(object sender, System.EventArgs e) { Thread iwth = new Thread( new ThreadStart(InputWaitThread) ); iwth.Start(); } (1)iwthは動的に割り当てたのでBTN_input_Click関数内でのみ有効だと  思うのですが、BTN_input_Click関数を抜けてしまったあとは、  InputWaitThreadを実行するスレッドは  どういう位置づけになるのでしょうか?  (ゾンビプロセスですか?) (2)また、このコードを含むアプリケーションの終了時、  InputWaitThreadがまだ終了していない場合は、  強制的に終了されるのでしょうか? (3)InputWaitThreadが必ず終了するという保障がない場合には、  KILLしてやらなければいけないと思いますが、動的に割り当てたので  ハンドラがおらずKILLできませんが、どうすればいいのでしょうか?  (静的に割り当てておくしかないのでしょうか?) 以上、よろしくご教授願います。(@±@)

  • VB タイマーコントロールをインデックスを使用し130個作成しました。

    VB タイマーコントロールをインデックスを使用し130個作成しました。 タイマーイベントの表記はどのようにするのでしょうか。 Private Sub Timer(0)_Timer()  ~ End Sub とするとエラーになります。タイマーコントロールのインデックスの使い方が分かりません。よろしくお願いします。

  • スレッド処理内での終了結果を知りたい

    VC++6.0(SP5)を使って、コマンドプロンプトのような処理を作成しています。  1.CreateProcess()でMS-DOSプロンプトを起動  2.CreatePipe()で実行コマンドの読み取り/終了監視スレッド用ハンドル作成  3.CreateThread()で実行コマンドの読み取り/終了監視スレッド作成  4.WriteFile()、ReadFile()を使っています。 'Dir'コマンド等を実行した際、通常プロンプトに表示されるメッセージを 読み取れてエディットボックスに表示できるのですが、異常/正常に関わらず 終了した時を取得したいのですが・・・。  (詳細)  1.WriteFile()を使って'Dir'コマンド実行  2.実行コマンドの出力が完了←この時点でコマンドプロンプトを終了させたい   ※WriteFile()関数の実行終了ではなく、'Dir'コマンド実行終了を知りたい 何方かご教授お願いします。

  • VB6.0のListBoxの使い方について

    VB6.0でリストボックスを3つ作成(配列index0~2)し、index=0のリストボックスをクリックした際にその項目を変数Xに入れたいのですが、X=List1.List(List.ListIndex)でやろうとするとエラーになります。なぜでしょう。何か参照になるサイトありますでしょうか?

  • マルチスレッドでの画像描画

    マルチスレッドを使ってロード画面を作ろうとしているのですが、 上手く画像が描画更新してくれません。 スレッドの中身は下記の通りです。よろしくお願いします。 HRESULT GameMain::LoadScreen() { // スレッドの生成 static bool onlyonce_createthread = FALSE; if(onlyonce_createthread ==FALSE) { hTh = (HANDLE)_beginthreadex( NULL, // SECURITY_ATTRIBUTES 構造体へのポインタ 0, // 新規スレッドのスタックサイズ &loadthread, // スレッドの実行開始アドレス this, // 新規スレッドに渡される引数リスト 0, // 新規スレッドの初期状態 (unsigned*)&thID ); // スレッドのIDを格納するためのDWORD型変数へのポインタ onlyonce_createthread =TRUE; } // ローディング画面の描画 static bool loopflg = TRUE; while(loopflg) { int threadCondition = CheckThread( hTh ); switch(threadCondition) { case THREAD_RUNNING: if(graphloaded_flg ==TRUE) { EnterCriticalSection( &m_criticalSection ); load_item = (float)(load_item/MAX_LOAD_ITEM); LeaveCriticalSection( &m_criticalSection ); d2d_control->GaugeDraw(0, 0, load_item); Sleep(100); } break; case THREAD_EXIT: loopflg =FALSE; break; case THREAD_ERROR: return E_FAIL; break; } } return S_OK; }