请教线程与showmodal的问题(200分)

  • 主题发起人 主题发起人 agaric
  • 开始时间 开始时间
A

agaric

Unregistered / Unconfirmed
GUEST, unregistred user!
我最近碰到一个奇怪的问题,我的代码大概是这样的。
在一个窗体里创建一个新线程,接收此线程的某些事件,
然后在事件中showmodal一个消息窗口。
但是这个消息窗口不是showmodal的,我不明白到底是因为什么,是不是跟线程有些关系,还是问题出在其他地方,请各位赐教。
 
Please see source code in function ShowModal:
function TCustomForm.ShowModal: Integer;
...
WindowList := DisableTaskWindows(0);// this line
...
function DisableTaskWindow enum current thread's windows by using
EnumThreadWindows(GetCurrentThreadID, @DoDisableWindow, 0);
because you show the message form in your thread not main thread, of course
it is not modal form.
 
不明白楼主的意思
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
在一个窗体里创建一个新线程,接收此线程的某些事件,
然后在事件中showmodal一个消息窗口。
 
嗯,明白lichengbin的意思。
是不是说,虽然showmodal是在主窗体的某个方法里写的,但是因为这个方法是接收了线程的事件,所以其实这个showmodal事件其实也是线程引发的?
那怎么解决这个问题呢?
to 桦树皮
其实代码应该是大概这样的,这样应该能看清楚。
var
theThread :TXXThread;
procedure Form1.CreateThread;
begin
theThread :=TXXThread.Create;
theThread.onError =do
ThreadError;
end;
procedure Form1.doThreadError;
begin
Form2.showmodal;
end;
 
Yeah, your onError must realize in Execute like this:
if Assigned(FonError) then
FonError;
so it is executed in TXXThread, not main thread.
You can write a ShowMessageForm method of TXXThread:
procedure TXXThread.ShowMessageForm;
begin
Form2.showmodal;
end;
then
use Synchronize(ShowMessageForm) to pop up message form.
 
解决问题了。设主窗体enbale属性就可以了,只是这样好像没有治本。
看看还有没有更好的办法。
 
嗯,这个方法应该是解决之道,只是我不能这样用。
道理明白了,问题也解决了,多谢。
 
后退
顶部