by 7 » 2006年12月16日(土) 22:59
> 過去のタイトル”settimerとkilltimer”で質問した初心者です。
> ありがとうございました。
どうでもいいような気もしますけどハンドルネームをもう少しユニークなものにしてはどうでしょう? 〝初心者X〟とか。
> タイマーの開始と終了です。
> 開始と終了のボタンを作り、確かに動作は正常。
> しかし、スレッドの内容が何も無いとき、終了のボタンを受け付けてくれません。
> スレッドの中にsleepを適当に入れると ”終了” します。
> 強力にスレッドを中止する方法はありますか。
これはSetTimer()関数を使って0秒毎にタイマーイベントを呼び出しているんですよね?
調べてないので嘘になるかもしれませんけどスレッドとタイマーイベントは別物です。間違った用語の使い方をしていると正しい解答を得られる可能性が低下してしまうので気を付けましょう。
強制的にスレッドを終了させるにはTerminateThread()関数を使います。
ボタン1を押すとスレッド開始、もう一度押すと終了。ボタン2を押すと強制的に終了。 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Dim isThread As BOOL
Dim hThread As HANDLE
Dim dwThID As DWord
Function ThreadFunc(ByVal lpParameter As VoidPtr) As DWord
Dim i As Long
While isThread
SetWindowText(hMainWnd,Str$(i))
i++
Wend
ThreadFunc=0
End Function
Sub MainWnd_CommandButton1_Click()
If isThread Then
isThread=FALSE
CloseHandle(hThread)
hThread=0
SetDlgItemText(hMainWnd,CommandButton1,"開始")
Else
hThread=CreateThread(ByVal NULL,0,AddressOf(ThreadFunc),0,0,VarPtr(dwThID))
isThread=TRUE
SetDlgItemText(hMainWnd,CommandButton1,"終了")
End If
End Sub
Sub MainWnd_CommandButton2_Click()
If hThread Then
TerminateThread(hThread,0)
End If
End Sub
頭の中の消しゴムが結構面白いです。
> 過去のタイトル”settimerとkilltimer”で質問した初心者です。
> ありがとうございました。
どうでもいいような気もしますけどハンドルネームをもう少しユニークなものにしてはどうでしょう? 〝初心者X〟とか。
> タイマーの開始と終了です。
> 開始と終了のボタンを作り、確かに動作は正常。
> しかし、スレッドの内容が何も無いとき、終了のボタンを受け付けてくれません。
> スレッドの中にsleepを適当に入れると ”終了” します。
> 強力にスレッドを中止する方法はありますか。
これはSetTimer()関数を使って0秒毎にタイマーイベントを呼び出しているんですよね?
調べてないので嘘になるかもしれませんけどスレッドとタイマーイベントは別物です。間違った用語の使い方をしていると正しい解答を得られる可能性が低下してしまうので気を付けましょう。
強制的にスレッドを終了させるにはTerminateThread()関数を使います。
[hide=ボタン1を押すとスレッド開始、もう一度押すと終了。ボタン2を押すと強制的に終了。][code]Dim isThread As BOOL
Dim hThread As HANDLE
Dim dwThID As DWord
Function ThreadFunc(ByVal lpParameter As VoidPtr) As DWord
Dim i As Long
While isThread
SetWindowText(hMainWnd,Str$(i))
i++
Wend
ThreadFunc=0
End Function
Sub MainWnd_CommandButton1_Click()
If isThread Then
isThread=FALSE
CloseHandle(hThread)
hThread=0
SetDlgItemText(hMainWnd,CommandButton1,"開始")
Else
hThread=CreateThread(ByVal NULL,0,AddressOf(ThreadFunc),0,0,VarPtr(dwThID))
isThread=TRUE
SetDlgItemText(hMainWnd,CommandButton1,"終了")
End If
End Sub
Sub MainWnd_CommandButton2_Click()
If hThread Then
TerminateThread(hThread,0)
End If
End Sub[/code][/hide]
頭の中の消しゴムが結構面白いです。