ab.com コミュニティ https://www.activebasic.com/forum/ |
|
終了したスレッドのCloseHandle処理について https://www.activebasic.com/forum/viewtopic.php?t=4634 |
ページ 1 / 1 |
作成者: | Papa [ 2020年1月20日(月) 10:43 ] |
記事の件名: | 終了したスレッドのCloseHandle処理について |
タイマーイベント内にてスレッドを作成し処理を行っています。 処理を終了したスレッドを見つける良い方法はありませんか? [ここをクリックすると内容が表示されます]
Dim hthMain(100) As HANDLE Dim ThCunte As Byte Sub MainWnd_Destroy() time_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) SetTimer(hMainWnd,100,1000,0) ThCunte = 0 End Sub Sub MainWnd_Timer(TimerID As DWord) Dim tID As Dword hthMain(ThCunte) = CreateThread(ByVal 0,0,AddressOf(tim_sub),0,0,VarPtr(tID)) '未使用の番号を見つけ次回使用したい!!! ' ThCunte = ???? '終了しているThread HandleをCloseしたい!!! ' CloseHandle( hthMain(????) ) End Sub Sub tim_sub() '実際の処理時間はまちまちなのでSleepで代用 Randomize Sleep(Int(Rnd()*10)*1000) End Sub |
作成者: | ゲスト [ 2020年1月21日(火) 01:08 ] |
記事の件名: | Re: 終了したスレッドのCloseHandle処理について |
スレッド終了検知には WaitForMultipleObjects() 関数が使えます。 貴方のコードを見ると、定期的に繰り返し呼び出される Timer イベントの中でスレッド終了検知処理を行なっておられるようなので、タイムアウトとして 0 [ms] を指定して、関数名に反して Wait せずに終了判定だけする使い方になろうかと思います。 が…このテの処理でモダンな設計としては、スレッドの生成と破棄をその都度その都度おこなうのではなく、私だったらスレッドプール方式を検討します。 |
作成者: | Papa [ 2020年1月23日(木) 09:55 ] |
記事の件名: | Re: 終了したスレッドのCloseHandle処理について |
GetExitCodeThreadにてスレッドの終了を見つけられ下記の様にしました。 これがスレッドプールと同じかどうかわかりませんが解決しました。 ありがとうございました。 [ここをクリックすると内容が表示されます]
Dim hthMain(100) As HANDLE Dim ThCunte As Byte Sub MainWnd_Destroy() time_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) SetTimer(hMainWnd,100,1000,0) ThCunte = 0 End Sub Sub MainWnd_Timer(TimerID As DWord) Dim tID As Dword Dim hCreateThread As HANDLE hCreateThread = CreateThread(ByVal 0,0,AddressOf(tim_sub),0,0,VarPtr(tID)) Dim cunt As Byte '空いているhthMain()にThread Handleを保存 For cunt = 1 To 100 If hthMain(cunt) = 0 Then hthMain(cunt) = hCreateThread Exit For End If Next '終了しているThread HandleをCloseする。 Dim ecode As DWord For cunt = 1 To 100 If GetExitCodeThread(hthMain(cunt), ecode ) <> 0 Then If ecode <> STILL_ACTIVE Then CloseHandle(hthMain(cunt)) ' スレッドハンドルを閉じる hthMain(cunt) = 0 End If End If Next End Sub Sub tim_sub() '実際の処理時間はまちまちなので、今回は乱数Sleepで代用 Randomize Sleep(Int(Rnd()*10)*500) End Sub |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |