delphi 用线程显示主线程窗口然后挂起自己就会假死。怎么解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 用线程显示主线程窗口然后挂起自己就会假死。怎么解决?相关的知识,希望对你有一定的参考价值。

下面是我的程序
function MyThreadFunc(P:pointer):Longint;stdcall;
var
i:integer;
begin
for I := 0 to form1.listview1.Items.Count - 1 do
begin

With form1.ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from main where 名字='''+form1.listview1.Items.Item[i].SubItems.Strings[1]+'''') ;
Open;
First;
if form1.ADOQuery1.eof then //如果数据库中没有当前的信息
Begin
form1.label1.Caption := '当前名字:'+form1.listview1.Items.Item[i].SubItems.Strings[1];
form1.panel1.Visible := true; //在panel1面板上修改相关资料并写入数据库
SuspendThread(form1.hThread);//程序运行到这一步就出现问题了,主线程仍然可以操作,响应鼠标事件,但是panel1就假死了
End;
end;
form1.getdirlist(form1.listview1.Items.Item[i].SubItems.Strings[1]);
end;

TerminateThread(form1.hThread,0); // 终止线程

end;

var MyAccess: TAccessApplication;//要加入access FileName: WideString; //************************ var ADOConnection:TADOConnection; //这个语句一定要加入adoconnection控件 ,或者要加入uses adodb; ADOQuery:TADOQuery; temppath:string;//存放临时目录 tb:boolean;//检查文件是否存在 begin try //首先判断是否有这个数据库 tb:= fileexists(edit1.Text ); if tb then exit; //如果数据库存在就退出 MyAccess := TAccessApplication.Create(Self); // myaccess.CloseCurrentDatabase ;//close database engin FileName := edit1.Text ; //如果路径不存在,程序不会自动创建 MyAccess.NewCurrentDatabase(FileName); myaccess.CloseCurrentDatabase; MyAccess.Disconnect; MyAccess.Free; //以上建库完毕 ,下面开始创建表和字段追问

你说的是什么啊,你知道我在问什么吗?

参考技术A 线程中不要直接访问主界面的控件..最好是用同步,搜索一下百度吧追问

首先说一下,忘了给分了,不好意思,这次加上。
我对线程不是很明白,帮我改一下程序吧,辛苦了

delphi 线程的应用 和spcomm的应用

http://bbs.csdn.net/topics/390744417

 

 

串口控件本身的线程不是这样理解的,你不用管它本身用不用线程,它的内部线程和你也没关系。前面说过了,你可以在自己的主线程里创建好Spcomm,并配置好各个参数,然后你的线程就可以用这个在主线程里创建的SPCOMM了。为了简单,一个线程单独用一个SPCOMM,这样就不用考虑各个线程间的冲突了。要发送的消息可以预先设置好一个列表传入通信子线程,通信子线程收到数据后给主线程发消息,可以这样发消息:

var
   aDataRec:TMyRec; 

.................
PostMessage(MainFormHandle,WM_MESSAGE001,Integer(@aDataRec),0);
................
//这个aDataRec可以是临时变量,这样就可以传递大数据了,也不要用全局变量了

如果上位机和下位要交互的信息是有限和预知的,可以在通信线程里设置好。如果是要人参与交互,那就得临时挂起通信线程了,控件通信流程。

以上是关于delphi 用线程显示主线程窗口然后挂起自己就会假死。怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章

delphi VCL显示问题 分线程与主线程的同步

挂起主线程,执行一些回调,然后恢复主线程

使用delphi多线程实现绑定某个EXE的进程并且向它发送键盘鼠标消息的实例。

在多线程中显示模态窗口,出现异常现象

QT中UI主窗口如何与子线程相互传递参数

delphi 的多线程问题