线程中如何打开一个窗口,并且在这个窗口关闭时得到一个返回值(100分)

  • 主题发起人 drizzledu
  • 开始时间
D

drizzledu

Unregistered / Unconfirmed
GUEST, unregistred user!
我的线程运行过程中需要人工识别一些数字或图片,故这时需要把这些数字或图片用一个窗体显示出来供人工选择,然后返回结果给线程继续运行
 
VCL可视控件不是线程安全的
所以,窗口一般都是放在主线程里的,用线程没必要
 
也可以使用线程, 但是使用sy 什么的函数就可以了
 
二楼是老人了,难得一见呵呵。
线程中最好不要直接涉及可视控件,不安全,调试也麻烦。
实在要用,通过消息让主线程来做,再返回值。
bBack := False;
PostMessage(MainForm.Handle, WM_MYMESSAGE, Value1, Value2);
while not bBackdo
sleep(100);
.....
 
线程自己创建一个窗口,用完就free,不是很方便吗,而且流程也很清晰容易理解
 
你就既然要等待用户输入完毕后才执行后面的,这本身就是个顺序的过程,干吗还要用线程?
我觉得应该是主进程显示输入窗口,输入完毕后关闭窗口启动再启动线程去处理输入
 
DELPHI中的可视组件都不是线程安全的,还包括大部份的非可视类组件。因此在线程中与组件交互时最好用Synchrolize(交互的方法名)
 
to hs-kill
窗口输入是在线程运行一段时间后随机出现的,并不是一开始就出现
 
to 楼主:
首先,第一个疑问是,你的这个程序需要用线程吗?因为涉及到用户的输入窗口,既然用到了这个,你不可能是多个线程同时执行吧,多线程一般都是用于需要多个线程同时执行,或者是在后台做一些功能处理之类的.如果需要用户输入数据,那就需要斟酌一下了.
第二,你为什么不用两个线程来处理呢?一个主线程,一个是子线程,子线程负责执行输入窗口出来之前的功能,而主线程负责全程,当子线程执行完毕之后,那就弹出输入窗口,等待数据输入,然后主线程就继续执行后面的部分了.
 
to cqwty,
需要线程,而且是几百个线程,用户输入是在线程执行过程中随机产生的,具有不确定性
我现在暂时用Synchrolize提交给主线程处理,不过这个Synchrolize据说效率不高啊,有哪位富翁有更好的办法否?直接在线程内部开个窗口提供给用户输入
 
var
bWait: Boolean;
procedure ShowForm1;
var
FMessage: TMsg;
Timer: Integer;
begin
bWait := True;
Form1.Show;
PeekMessage(FMessage, 0, WM_USER, WM_USER, PM_NOREMOVE);
Timer := SetTimer(0,1,1000,nil);
//定时器设为1000毫秒
while (GetMessage(FMessage, 0, 0, 0) and bWait)do
begin
case FMessage.message of
WM_TIMER: {Do Something};
end;
DispatchMessage(FMessage);
end;
KillTimer(0,Timer);
end;

//在窗体的 OnDestroy 事件里
bWait := False;
 
多人接受答案了。
 
顶部