2017-07-09 38 views
-1

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

是否有可能做到这一点,但无需创建一个单独的thread? (这看起来很复杂,我想避免这种情况)。


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

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

的图形用户界面将是不响应。

+0

“这看起来很复杂” - 做复杂的事情很复杂。 –

+0

产生一个线程,并把你的例程。 – Ron

+0

@NeilButterworth我可以做*如果需要*,但我想说“没有其他方法吗?”。 – Basj

回答

1

创建一个线程真的不是,因为它可能最初看起来几乎一样复杂。

当你需要支持线程之间的互动,事情可能是相当复杂 - 但在这种情况下,所有你需要的是开始做,后来得到,它的工作的通知。而已。

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

真的没有太多比它。说真的,这并不复杂也不复杂。

+0

谢谢@JerryCoffin。在加载完成后,MainThread是否可以在LoadDB()期间通过Thread2加载'std :: vector ? – Basj

+1

@Basj:如果你想要访问它,你需要确保它是可访问的。如果(例如)它是一个全局变量,那么是可以访问的。如果它是动态分配的,则需要将其地址传回给代码的其余部分,以便让它们知道它的位置。但最终,线程都共享相同的地址空间,因此您在一个线程中执行的操作很容易让其他人看到。 –

相关问题