Delphi 线程resume 不能调用Execute

如果Resume不能唤起线程,请试试如下的函数,试试。

 GetExitCodeThread(ThreadHandle,ExitCode)
来取得ExitCode,如果ExitCode=STILL_ACTIVE
表示线程还存在,对于存在的线程,则可以使用ResumeThread(ThreadHandle)来唤醒线程,如果线程仍然处于运行状态,则会返回错误具体的自己去看相关的API的返回值。

本人在实际应用中还是没能够解决上面问题,只好委曲找到另一种解决方法。

procedure TfrmDataExchangePlatformMain.ActionStartServiceExecute(
  Sender: TObject);
begin
  StatusBar1.Panels[1].Text := '当前操作: ' + ActionStartService.Caption;
  Screen.Cursor := crHourGlass;
  try
    FExecfinish := True;
    Timer_Service.Enabled := True;
    //MyThread.Resume;
  finally
    Screen.Cursor := crDefault;
  end;
end;


{
procedure TfrmDataExchangePlatformMain.Timer_ServiceTimer(Sender: TObject);
var
  ExitCode: DWORD;
begin
  //if MyThread.MyThreadExecfinish then
    //MyThread.Execute;
    MyThread.Resume;

    GetExitCodeThread(MyThread.Handle,ExitCode);

    if not MyThread.Suspended then
    begin
      ShowMessage('可以运行');
    end;

    if ExitCode=STILL_ACTIVE then
    begin
      ShowMessage('可以运行');
    end;
end;
 }

procedure TfrmDataExchangePlatformMain.Timer_ServiceTimer(Sender: TObject);
begin
  MyThread := TMyThread.CreateEx(False);
  MyThread.ExeTimer := Timer_Service;
  MyThread.MemoLogStrings := cxMemo_Log.Lines;
  MyThread.LogStrings := cxMemo_Log.Lines;;
  MyThread.MyThreadExecfinish := True;
  MyThread.HTTPRIOLeExp := DMConn.HTTPRIOLeExp;
  MyThread.HTTPRIONC := DMConn.HTTPRIONC;
end;

{ TMyThread }

procedure TMyThread.Execute;
begin
  inherited;
  FreeOnTerminate := True; {这可以让线程执行完毕后随即释放}
  if MyThreadExecfinish then
    ExecTimer;
end;

function  TMyThread.ExecTimer: Boolean;
begin
  Result := False ;
  FMyThreadExecfinish := False;
  Screen.Cursor := crHourGlass;
  CoInitialize(nil);
  try
    FExeTimer.Enabled := False;
    TranspondClientBaseData_factory1(HTTPRIOLeExp, HTTPRIONC, LogStrings);
    Sleep(1);
    TranspondPersonBaseData_factory1(HTTPRIOLeExp, HTTPRIONC, LogStrings);
    Sleep(1);
    TranspondDeptBaseData_factory1(HTTPRIOLeExp, HTTPRIONC, LogStrings);
    //readLogStrings;
    //SaveLogFile;

  finally
    Result := True;
    FMyThreadExecfinish := True;
    CoUninitialize;
    FExeTimer.Enabled := True;
    Screen.Cursor := crDefault;
    //Suspended := True;
  end;

end;

 

遇到此问题的,不妨这么试试吧,  其实上面找到了原因,但是找不到解决方法,  上面应该是线程被停止了,不存在了, 但是就是不知道在哪被停止的,  因为执行两次resume的时候 exitcode和STILL_ACTIVE还是一样, 但是就是在以后就为0了,  不知道怎么回事。不找原因啦,  就用上面这个方法啦。  如果明白的,请告知小弟,嘿嘿。

 

更多相关文章
一周排行
  • 这题其实就是一个在二叉搜索树里面找前驱和后继的题,以前好像用线段树+离散化搞过,弄得比较挫,学会AVL了之后就是方便. 简单说一下怎么找前驱和后继, 前驱的话,如果当前节点有左子树,那么前驱就是左子树中的最大节点,否
  •   一.什么是软件测试 软件测试是一种用来促进鉴定软件的正确性.完整性.安全性和质量的过程 英语的解释是 Software testing is an investigation conducted to provi ...
  • 3.2.2 在 C# 中实现元组类型 System 命名空间中可用的实际 Tuple<T1, T2> 类型更复杂,但是,我们可以很容易实现在这一章中的我们所需要的功能.我们会按照与 .NET 类型相同的命 ...
  • 小學生之手(01)之 &quot;for循環&quot;
    恢复内容开始 咳咳咳!第一次要写这种东西,要是有不足的地方,请见谅!!!并且感觉在这班门弄
  • 因为网页中的 Flash 是以控件形式出现的,优先级别较高,所以直接对它加链接是无效的,不过可以用按钮控件 BUTTON 来实现. 具体步骤 1.直接在按钮上加上onClick事件打开指定页面: <button ...
  • set Autotrace的使用 关于Autotrace几个常用选项的说明: SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式 SET AUTOTRA
  • 1.安装 #yum install subversion 测试安装是否成功: #svnserve –version 回车显示版本说明安装成功 2.配置 ·建立版本库 #mkdir /opt/svndata 创建svn
  • SOAP vs REST
    SOAP vs. REST是一个伪命题,对它们进行直接比较并不恰当,因为SOAP(简单对象
  • BZOJ1566 NOI2009管道取珠
    这是一道思维复杂度很高的DP题 看题目,为什么是取两次序列一样呢?YY一下,其实等价于两个
  • 运用开源的geoserver+postgis+postgresql+arcgis for flex api 开发地图应用系统. 1.Geoserver          GeoServer 是 OpenGIS Web ...