如果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(1000);
    TranspondPersonBaseData_factory1(HTTPRIOLeExp, HTTPRIONC, LogStrings);
    Sleep(1000);
    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了,  不知道怎么回事。不找原因啦,  就用上面这个方法啦。  如果明白的,请告知小弟,嘿嘿。

Delphi 线程resume 不能调用Execute的更多相关文章

  1. Delphi线程基础知识

    参考http://blog.chinaunix.net/uid-10535208-id-2949323.html 一.概述 Delphi提供了好几种对象以方便进行多线程编程.多线程应用程序有以下几方面 ...

  2. 多线程的基本概念和Delphi线程对象Tthread介绍

    多线程的基本概念和Delphi线程对象Tthread介绍 作者:xiaoru    WIN 98/NT/2000/XP是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU运行 ...

  3. TMsgThread, TCommThread -- 在delphi线程中实现消息循环

    http://delphi.cjcsoft.net//viewthread.php?tid=635 在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使 ...

  4. TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)

    在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供.   花了两天的事件研究了 ...

  5. Delphi线程定时器TThreadedTimer及用法--还有TThreadList用法可以locklist

    Delphi线程定时器 - -人生如歌- - 博客园http://www.cnblogs.com/zhengwei0113/p/4192010.html (* 自己编写的线程计时器,没有采用消息机制, ...

  6. delphi 线程教学第二节:在线程时空中操作界面(UI)

    第二节:在线程时空中操作界面(UI)   1.为什么要用 TThread ?   TThread 基于操作系统的线程函数封装,隐藏了诸多繁琐的细节. 适合于大部分情况多线程任务的实现.这个理由足够了吧 ...

  7. delphi 线程教学第一节:初识多线程

    第一节:初识多线程   1.为什么要学习多线程编程?   多线程(多个线程同时运行)编程,亦可称之为异步编程. 有了多线程,主界面才不会因为耗时代码而造成“假死“状态. 有了多线程,才能使多个任务同时 ...

  8. Java线程池ThreadPoolExecuter:execute()原理

    一.线程池执行任务的流程 如果线程池工作线程数<corePoolSize,创建新线程执行task,并不断轮训t等待队列处理task. 如果线程池工作线程数>=corePoolSize并且等 ...

  9. Java 线程池submit和execute

    submit方法: public abstract class AbstractExecutorService implements ExecutorService { protected <T ...

随机推荐

  1. 八皇后问题 lua版

    简单来讲就是如何在一个8x8的棋盘中放八个棋,让他们两两不能在同一行,同一列,同一斜线. 直接贴代码(出至:programming in lua 3 ) --棋盘大小 SIZE = --判断棋放在ro ...

  2. [转] linux中cat more less head tail 命令

    1.cat 显示文件连接文件内容的工具: cat 是一个文本文件查看和连接工具.查看一个文件的内容,用cat比较简单,就是cat 后面直接接文件名. 比如: [root@localhost ~]# c ...

  3. 使用downloadmanager调用系统的下载

    /** * 文件名 UpdateDownload.java * 包含类名列表 com.issmobile.numlibrary.tool * 版本信息  版本号  * 创建日期 2014年7月14日  ...

  4. POJ 1330 Nearest Common Ancestors(LCA模板)

    给定一棵树求任意两个节点的公共祖先 tarjan离线求LCA思想是,先把所有的查询保存起来,然后dfs一遍树的时候在判断.如果当前节点是要求的两个节点当中的一个,那么再判断另外一个是否已经访问过,如果 ...

  5. C#学习第六天

    今天的内容主要是参数数组,C#允许函数指定一个(只能指定一个)特定的参数,这个参数必须是函数定义中最后一个参数,成为参数数组. 参数数组可以使用个数不定的参数调用函数,可以使用params关键字定义它 ...

  6. 查看Oracle数据库被锁住的表,删除锁表的进程

    锁表处理及查询 查看Oracle数据库被锁住的表,删除锁表的进程 1.查看被锁住的表 SELECT dob.object_name table_name,    lo.locked_mode, lo. ...

  7. jQuery选择器实现隔行变色

    <script type="text/javascript"> $(function(){ $("#tableName tr:nth-child(even)& ...

  8. ASP.NET5中间件

    小的应用组件可以包含到Http请求管道当中,ASP.NET5 集成了中间件,被包在了应用程序的Configure方法当中. 1. 什么是中间件 中间件是一组被装到应用程序管道的请求和响应中的组件.每一 ...

  9. 通过Unity依赖注入

    前言 Unity容器的思想起始于我在为Web Client Sofitware Factory项目工作的时候,微软的patterns&practices团队已经使用依赖注入的概念好几年了在那时 ...

  10. 零散的笔记:jquery中的事件

    1.替代mouseover和mouseout的事件 jquery的mouseover和mouseout事件在移到子页面时也会触发,这在移到一级菜单弹出二级菜单,移到二级菜单时一级菜单也要显示时,这两个 ...