在销毁之后从线程接收Windows消息

时间:2013-12-04 15:20:32

标签: windows multithreading message

我在一个单独的线程中使用FTP客户端。 FTP客户端使用作业列表将文件上载/下载到连接的服务器。如果线程想要与我的主线程通信,它将使用事件队列。该线程将创建一个事件,将其放入队列,然后将一条Windows消息发布到我的主线程,告诉我队列中有新事件。 然后主线程从队列中获取最新事件并将其删除。队列保存在线程对象中,但我使用锁来使其成为线程安全的。 我在主线程中创建了一个函数,它正在侦听来自FTP线程的消息。我还注册了这个方法的句柄(通过AllocateHwnd()),以便线程将其消息完全发布到我的主线程的监听方法。

现在我想知道以下情况是否可行:

我摧毁线程。在它被销毁之前,线程会将一条Windows消息发布到主线程,因为有一个新事件。然而,Windows消息有一些延迟(无论出于何种原因)。现在线程被破坏,线程对象消失了。当然,事件队列也消失了。主线程现在收到延迟的Windows消息,告诉他队列中有新事件。它尝试获取队列,这将导致无效的指针操作,因为队列和线程对象已被释放。

为了避免这个问题,我实施了对我的消息监听方法的检查。在我从线程访问事件队列之前,我将检查线程是否仍然存在。如果是,那么我访问事件队列,如果没有,那么我将简单地删除该消息。

但是,如果线程在我检查之后,但在我访问队列之前被破坏了怎么办?顺序是这样的:

  • 检查线程是否存在
  • (线程现在被破坏)
  • 访问事件队列

这种情况还会发生吗?我知道这听起来像一个非常具体和微小的场景,因为线程必须在这两个命令之间被摧毁以便失败但是我想确保当线程实际上没有时我不访问事件队列已经存在了。

我希望我能够很好地解释我的问题。提前感谢您提供的任何答案。

0 个答案:

没有答案