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中编写安全、可靠和稳定的多线程代码”。