急:1、程序运行一段时间界面自动关闭,但是进程还存在;2、多线程中定时器的使用。 ( 积分: 200 )

  • 主题发起人 主题发起人 xiaoxinxx168
  • 开始时间 开始时间
X

xiaoxinxx168

Unregistered / Unconfirmed
GUEST, unregistred user!
1、程序为多线程,不过使用了同步(Synchronize),接收客户端传递过来的XML文件,然后创建线程,根据XML的不同内存执行不同的操作。但是程序运行一段时间后,程序界面自动关闭,但是在任务管理器中还存在此进程。各位碰到过类似情况吗?帮忙给出一点线索。
2、我想不使用同步(Synchronize),但是我的线程中使用了一个控件,这个控件里面有个定时器在实时扫描外部传递过来的消息,然后生成事件。我原来是用了一个线程来代替这个定时器,线程主要代码如下:
Signaled := WaitForSingleObject(FStopEvent,FInterval);
// if event occurs, dispatch it
if (Signaled = WAIT_TIMEOUT) and Assigned(FOnTimerTick) then
FOnTimerTick(Self);
until Signaled <> WAIT_TIMEOUT;
但是这段代码不稳定,有些消息接收不到,请我是什么原因?有没有其它的好方法?
 
1、程序为多线程,不过使用了同步(Synchronize),接收客户端传递过来的XML文件,然后创建线程,根据XML的不同内存执行不同的操作。但是程序运行一段时间后,程序界面自动关闭,但是在任务管理器中还存在此进程。各位碰到过类似情况吗?帮忙给出一点线索。
2、我想不使用同步(Synchronize),但是我的线程中使用了一个控件,这个控件里面有个定时器在实时扫描外部传递过来的消息,然后生成事件。我原来是用了一个线程来代替这个定时器,线程主要代码如下:
Signaled := WaitForSingleObject(FStopEvent,FInterval);
// if event occurs, dispatch it
if (Signaled = WAIT_TIMEOUT) and Assigned(FOnTimerTick) then
FOnTimerTick(Self);
until Signaled <> WAIT_TIMEOUT;
但是这段代码不稳定,有些消息接收不到,请我是什么原因?有没有其它的好方法?
 
刚才贴的代码不完全,这个是线程中的主要的代码:
while FEnableddo
begin
repeat
Signaled := WaitForSingleObject(FStopEvent,FInterval);
// if event occurs, dispatch it
if (Signaled = WAIT_TIMEOUT) and Assigned(FOnTimerTick) then
FOnTimerTick(Self);
until Signaled <> WAIT_TIMEOUT;

end;
 
FStopEvent是不是永远都不会释放( WaitForSingleObject应该永远返回WAIT_TIMEOUT)?
就从代码来看,如果某些情况下释放了FStopEvent,那么即使时间到了(FInterval),也不会执行FOnTimerTick(Self)的。 要是这种情况,干嘛不Sleep(FInterval)一下,再去读一个全局共用的内存变量的标志,根据标志再执行某些操作呢
 
谢谢楼上的,我使用了几种方法都是一样的问题:
1:
while FEnableddo
begin
Sleepex(FInterval,false);//或者sleep(FInterval);
if Assigned(FOnTimerTick) then
FOnTimerTick(Self);
end;

2:
while FEnableddo
begin
WaitForSingleObject(FStopEvent,FInterval);
FOnTimerTick(self);

end;
 
第一个问题不太清楚,
界面的自动关闭是意外的自动关闭还是写代码就是要让它自动关闭呢?
要是计划中的,关闭用的是MainForm.Close,还是Application.Terminate, 还是检查清理的子线程后再关闭的? 帮顶一下
第二个问题:
消息接受不到,指的是FOnTimerTick(self)没有被执行吗?
 
第一个问题:
程序界面自己意外关闭的,但是进程还存在;
第二个问题:
有时候能够执行,有时候执行不了。
 
意外关闭的,那么进程存在就是正常啦。跟踪一下代码,应该是主窗口在某些条件下隐藏了(visible:=false)。
执行不了,那还是执行了的,只是执行不了而已。问题是不是出在FOnTimerTick指向的函数代码里面呢
 
1、程序没有任何代码是把窗口隐藏的。
2、不是执行不了,而是不稳定,有时能够收到消息,有时又收不到。
 
按理说,如果是主窗口隐藏了的话任务栏应该有还有它。不知道原因,帮顶。
判断有没有收到消息的标志是什么呢, FOnTimerTick被执行吗?
你要是用sleep的话就不用FOnTimerTick了,直接写工作代码进去到那个函数里去了。
建议把那个函数指针FOnTimerTick改名为:FOnNotified,或者FDoSomething.

一个全局变量:var GlobalVal:boolean;(或者是提供跨进程访问功能的一个类)
while FEnableddo
begin
sleep(FInterval);
if not GlobalVal then
continue
else
if Assigned(FDoSomething) then
FDoSomething(Self);
end;

另一个线(进)程写GlobalVal,写之前加个互斥锁,写完打开锁。
 
我在FOnTimerTick(self)的事件中是做循环,一旦收到消息,就根据消息的信息来产生不同的事件,然后根据事件做不同的操作,现在就是发现有时候可以产生事件,有时候产生不了,应该不是FOnTimerTick(self)代码的问题,因为这些代码在同步状态下是能够正常执行,没问题的。
不明白楼上的加一个:GlobalVal变量有什么用处。
 
1.或许你关闭的是副窗体,而主窗体只是visible=false,所以程序还在运行
2.不知道
 
GlobalVal和你的消息是差不多的意思。
在其他线程中设置标志位,在此线程中定时检查。
我看你写出来的代码好像没有什么问题。排除法只好认为FOnTimerTick(self)指向的代码了。 设置断点,调试跟踪应该可以找到问题的。
“有时候可以产生事件,有时候产生不了”这句话是什么意思呢?产生不了指的是没有执行FOnTimerTick吗? 不要告诉我“执行了,但是执行不了”。:D
 
我知道你的意思了,是不是你在其他线程里设置标志位了,或者你说的,对FEvent释放了或者其他操作了,但是在FOnTimerTick的读取FEvent中,没读到预料中的值。是不是这个意思呢
 
来自:再见卡门, 时间:2005-10-14 16:16:24, ID:3238060
1.或许你关闭的是副窗体,而主窗体只是visible=false,所以程序还在运行
2.不知道
1、我就有一个主窗体,窗体上放了一个TCPSERVER控件,接收客户端的TCPCLIENT控件发送过来的消息,当主窗体自动不正常的关闭后,TCPSERVER控件就收不到消息了,或者说不执行客户端传递过来的消息了。
2、我也不知道。
 
举个例子:FOnTimerTick接收到消息后,我就会根据消息来做相应的操作,比如一些状态的改变。但是现在状态有时候改变有时候又不改变。而FOnTimerTick在使用定时器的时候是正常的。
 
俺是栽在这里面啦。
调试跟踪应该可以找到问题的。
你的第一个问题和第二个问题是不是有关系。比如消息来自第一个程序,第二个程序根据消息改变某些状态?
我知道你是在FOnTimerTick写了“改变状态的的语句”的。 “现在状态有时候改变有时候又不改变”,不改变的原因是什么呢? 就是那条“改变状态的语句”出问题(1),还是那条“改变状态的语句”没有执行(2),还是包含那条“改变状态的语句”的FOnTimerTick函数没有被调用(3)呢?
(1)表示FOnTimerTick中“改变状态的语句”语句本身或者语句所调用的子函数出问题了,
(2)表示FOnTimerTick出问题了
(3)表示问题与FOnTimerTick函数无关,确实是你在问题2种写的那些代码问题。
 
晕了,我算是栽在这里了,看你的话头都大了,现在思维模糊了,等清醒了再看。
我觉得我的问题已经说得比较清楚了啊。第一个问题是在使用了同步得情况下得问题;
第二个问题是在不使用同步的情况下得问题啊。
 
后退
顶部