Delphi 如何获取线程暂停时的信息
当我的线程在恢复后暂停时,我如何获得操作(对不起,我的英语不好) 好的,我会用代码解释Delphi 如何获取线程暂停时的信息,delphi,Delphi,当我的线程在恢复后暂停时,我如何获得操作(对不起,我的英语不好) 好的,我会用代码解释 function mythreadf(p:Pointer):DWORD stdcall; var i:Integer; begin for i:=0 to 1000000 do begin if myevent.WaitFor(INFINITE)=wrsignaled then begin if Form1.RadioButton1.Checke
function mythreadf(p:Pointer):DWORD stdcall;
var i:Integer;
begin
for i:=0 to 1000000 do begin
if myevent.WaitFor(INFINITE)=wrsignaled
then
begin
if Form1.RadioButton1.Checked then ShowMessage('Checked');
Form1.Label1.Caption:=IntToStr(i);
end;
end;
end;
我正在使用resetevent和setevent暂停和恢复线程
在我通过单击resetevent按钮暂停我的线程后,然后再次使用setevent恢复我的线程时,我检查了radiobotton1。不要发送发生错误和关闭应用程序:(
在这个问题上有人能帮我吗
问候
编辑1:
错误图像
在工作线程中直接访问VCL UI控件不是线程安全的(即使ShowMessage()也不是线程安全的。直接使用Win32 API MessageBox())。可能会发生各种不好的情况,包括崩溃。您必须将UI访问权委托给主线程。TThread类有一个Synchronize()方法。也可以使用您选择的任何其他线程间同步,例如使用SendMessage()将自定义消息发送到通过AllocateHWnd()或CreateWindow/Ex()在主线程中创建的隐藏窗口。直接在工作线程中访问VCL UI控件不是线程安全的(甚至ShowMessage()不是线程安全的。请直接使用Win32 API MessageBox()。可能会发生各种不好的情况,包括崩溃。您必须将UI访问权委托给主线程。TThread类有一个Synchronize()方法。也可以使用您选择的任何其他线程间同步,例如使用SendMessage()通过AllocateHWnd()或CreateWindow/Ex()将自定义消息发送到主线程中创建的隐藏窗口.正如Remy所说,你的线程不应该访问复选框。这也是一种糟糕的编程风格。你的后台线程有一个目的?这个目的将帮助你找到一个名称。如果你创建一个从TThread继承的类,你会走得更远、更快
interface
type
TMyElephantCountingThread = class(TThread)
protected
FResultStr:String; // holds something for later display on the user interface
FOptionChecked:Boolean; // set from main thread, to tell background thread whether or not a checkbox option is checked.
....
end;
....
implementation
....
function TMyElephantCountingThread.ElephantCounterResults;
begin
// all data fields in here is local to this thread
if FOptionChecked then
FResultStr := IntToStr(FIntegerValue);
end;
正如您所看到的,我上面的代码只使用属于我的线程对象的字段
如果需要将FOptionChecked设置为等于Checkbox.checked的值,则必须在主线程中执行此操作
您不能将写代码从前台线程(可以访问VCL对象)复制并粘贴到后台线程代码(不能安全访问这些对象)中,不会出现问题。正如Remy所说,你的线程不应该访问复选框。而且这是一种糟糕的编程风格。你的后台线程有一个目的?这个目的将帮助你找到一个名称。如果你创建一个继承自TThread的类,你会走得更远、更快
interface
type
TMyElephantCountingThread = class(TThread)
protected
FResultStr:String; // holds something for later display on the user interface
FOptionChecked:Boolean; // set from main thread, to tell background thread whether or not a checkbox option is checked.
....
end;
....
implementation
....
function TMyElephantCountingThread.ElephantCounterResults;
begin
// all data fields in here is local to this thread
if FOptionChecked then
FResultStr := IntToStr(FIntegerValue);
end;
正如您所看到的,我上面的代码只使用属于我的线程对象的字段
如果需要将FOptionChecked设置为等于Checkbox.checked的值,则必须在主线程中执行此操作
您不能将写代码从前台线程(可以访问VCL对象)复制并粘贴到后台线程代码(无法安全访问这些对象)中,也不能预料会出现问题。我不太清楚您的意思,“当再次使用setevent恢复我的线程时。不要发送发生错误和关闭应用程序。”调用SetEvent时,会发生某种错误,导致应用程序关闭(崩溃?)意外。它是否提供了一个错误对话框?消息说了什么?如果您发布了有关错误的详细信息,这会有很大帮助。添加了错误图像,请参阅主帖子SIR,这没有多大帮助。请尝试在调试器下运行它,并查看它是否提供了任何异常对话框。这些对话框将包含有用的信息。此问题的更好名称:“我如何学习在Delphi中编写安全、可靠和稳定的多线程代码”。我不太清楚您的意思,“当再次使用setevent恢复线程时。不要发送错误发生和应用程序关闭。”当您调用setevent时,会发生某种错误,导致应用程序关闭(崩溃?)意外。它是否提供了一个错误对话框?消息说了什么?如果您发布了有关错误的详细信息,这会有很大帮助。添加了错误图像,请参阅主帖子SIR,这没有多大帮助。请尝试在调试器下运行它,并查看它是否提供了任何异常对话框。这些对话框将包含有用的信息。此问题的更好名称:“如何学习在Delphi中编写安全、可靠和稳定的多线程代码”。