【问题标题】:Create a timer on a different thread - with no callback function (C, Windows)在不同的线程上创建一个计时器 - 没有回调函数(C,Windows)
【发布时间】:2009-09-08 17:08:56
【问题描述】:

有没有办法在不同的线程上创建一个计时器(比如 10 秒)? 我的意思是,我知道如何使用 CreateThread() 并且我知道如何创建/使用计时器。我遇到的问题是新线程无法接收回调函数。

对于那些不可避免地会问“你为什么要这样做?”的人。答案是因为我必须这样做。它是一个更大程序的一部分,不能在代码的这个特定部分使用回调函数。就是这样。

有什么办法可以做到吗?

代码表示赞赏。

谢谢!

编辑:

对问题的更好解释: 我的应用程序由两个独立的程序组成。主程序(可见,用户界面)和另一个在后台做艰苦的工作(有点像守护进程)。 后台进程需要在退出前完成对数据库的写入并关闭很多小文件。 主应用程序向该后台进程发送“我们完成了”消息。收到此消息后,后台进程将返回当前状态并存在。 现在,我需要添加以下内容:收到消息后,它返回一个状态并触发一个计时器,该计时器将在另一个线程上等待 X 时间,同时后台进程关闭所有数据库连接和文件。如果计时器达到 0 并且后台进程仍然存在,那么它将终止它。如果后台进程关闭了所有数据库和文件,那么线程(和计时器)将在达到 0 之前终止,因为应用程序正常终止。

这样更好吗?

【问题讨论】:

  • 呃,对不起,我误读了这个问题。如果你不能使用回调(虽然我无法想象这种情况),那么你可以为每个计时器编写一个 ThreadProc 吗?
  • 请阅读该问题的编辑
  • 我无法想象一个不排除线程的“无回调函数”策略,因为线程是一个函数,你可以让操作系统重新调用你,尽管有一个新的堆栈上下文.

标签: c windows multithreading timer


【解决方案1】:

因此,您需要在 DB 进程中设置一个看门狗(我又误读了一遍,不是吗)。像这样的 ThreadProc 可能就足够了,因为所有线程都会在主线程终止时终止:

DWORD WINAPI TerminateAfter10s(LPVOID param) {
 Sleep(10000);
 ExitProcess(0);
}

【讨论】:

  • true,但我的主应用程序已经终止。后台进程被留下来处理未完成的数据库连接。
  • 唯一的问题是主线程需要返回状态码,然后清理,然后检查是否需要终止。如果我放一个 sleep() 它将冻结应用程序。正如我多次提到的,我不能使用回调函数。没有 ThreadProc...
  • 嗯,不使用 ThreadProc 就不能创建线程(这个应该在这个后台进程中)。在单独的线程中休眠不会冻结应用程序(如果 main 先完成,此线程将被终止),并且 ExitProcess 负责返回状态代码(除非您通过“状态代码”表示其他意思)。
  • 好的,这是一个可能的答案:不可能。我会等到明天。如果没有,没有其他答案,那么“不可能”将是答案,我会接受你的。谢谢!
  • 我接受这个作为答案,因为没有别的解决方案
【解决方案2】:

如果你使用多媒体定时器函数timeSetEvent,它可以被配置为脉冲事件而不是使用正常的回调。是否满足要求?

我更想知道为什么您有此要求以避免使用回调。回调似乎完全适合在工作线程中使用。

【讨论】:

  • 谢谢,这可能是一个很好的解决方案,但是我认为我没有正确解释问题。我不能使用回调函数。 timeSetEvent() 使用回调来执行需要执行的任何操作。我正在为这个问题添加一个适当的解释。
  • 嗯,就是这样。我不能使用回调。
  • 再次阅读帮助,timeSetEvent 不必使用回调。您可以指定 TIME_CALLBACK_EVENT_SET 来设置事件。但是,如果您甚至不准备创建另一个线程来等待该事件,我看不出我们可以如何帮助您。
  • 所有我读过的和我见过的例子都调用了一个回调函数。如果您可以发布代码,那将会很有帮助。这就是为什么我在“代码受到赞赏”的问题中写道。
猜你喜欢
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多