【问题标题】:Background job while launching a Windows GUI application启动 Windows GUI 应用程序时的后台作业
【发布时间】:2017-07-09 22:29:28
【问题描述】:

当我的 Win32 应用程序启动时,LoadDB() 应该被执行,它至少需要 10 或 20 秒。在哪里执行LoadDB(),作为后台加载任务,为了防止GUI窗口无响应?

是否可以这样做,但不必创建单独的thread? (这看起来很复杂,我想避免这种情况)。


注意:如果我在主消息循环中这样做:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CREATE:
            LoadDB();
            ...

GUI 将无响应。

【问题讨论】:

  • “这看起来很复杂”——做复杂的事情很复杂。
  • 产生一个线程并将你的例程放在那里。
  • @NeilButterworth 我可以如果需要,但我想说“难道没有其他方法吗?”。
  • 在现代 C++ 中处理线程实际上很容易,但看起来您正在编写一个 C 程序,而您恰好使用 C++ 编译器进行编译。
  • 那我可以使用这个@NeilButterworth。你会从哪里开始这个动作/线程? WM_CREATE / 其他地方?

标签: c++ user-interface winapi


【解决方案1】:

创建线程实际上并不像最初看起来那么复杂。

当您需要支持线程之间的交互时,事情可能会相当复杂——但在这种情况下,您只需要开始一些事情,然后得到一个通知它已经完成。就是这样。

因此,您要做的是编写一个调用 loadDB() 的小函数,然后(例如)调用 PostMessage 让应用程序的其余部分知道数据库已加载并可以使用。

真的没有比这更多的了。说真的,真的不复杂也不复杂。

【讨论】:

  • 谢谢@JerryCoffin。加载完成后,Thread2 在 LoadDB() 期间加载的 std::vector<std:wstring> 是否可以被 MainThread 访问?
  • @Basj:如果您希望它可访问,您需要确保它是可访问的。如果(例如)它是一个全局变量,那么可以访问。如果它是动态分配的,您需要将其地址传回给其余代码,让他们知道它在哪里。但归根结底,线程都共享相同的地址空间,因此您在一个线程中所做的事情可以很容易地让其他线程看到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多