2017-07-09 3 views
-1

Wenn meine Win32-Anwendung gestartet wird, sollte LoadDB() ausgeführt werden und es dauert mindestens 10 oder 20 Sekunden. Wo LoadDB() ausführen, als Hintergrund laden Aufgabe, um zu verhindern, dass das GUI-Fenster reagiert nicht?Hintergrundjob beim Starten einer Windows GUI-Anwendung

Ist es möglich, es zu tun, aber ohne eine separate thread erstellen zu müssen? (Das sah kompliziert aus und ich wollte das vermeiden).


Hinweis: Wenn ich es in der Nachrichtenschleife tun:

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

die GUI nicht-reagiert werden.

+0

"Das sah kompliziert aus" - komplizierte Dinge zu tun ist kompliziert. –

+0

Spawn einen Thread und legen Sie Ihre Routinen dort. – Ron

+0

@NeilButterworth Ich bin in Ordnung, wenn es nötig ist *, aber ich wollte sagen "Gibt es keine andere Methode?". – Basj

Antwort

1

Erstellen eines Threads ist wirklich nicht annähernd so komplex wie es zunächst scheinen mag.

Wenn Sie die Interaktion zwischen Threads unterstützen müssen, können die Dinge ziemlich komplex sein - aber in diesem Fall genügt es, etwas zu starten und später eine Benachrichtigung zu erhalten. Das ist es.

Also, was Sie tun möchten, ist eine kleine Funktion schreiben, die LOADDB() aufruft, dann (zum Beispiel) ruft PostMessage der Rest der Anwendung zu informieren, dass die DB geladen und einsatzbereit.

Es gibt wirklich nicht viel mehr als das. Im Ernst, es ist wirklich nicht kompliziert oder kompliziert.

+0

Danke @JerryCoffin. Wird der 'std :: vector ', der während 'LoadDB()' von Thread2 geladen wurde, nach dem Laden von MainThread erreichbar sein? – Basj

+1

@Basj: Wenn Sie es zugänglich machen möchten, müssen Sie sicherstellen, dass es zugänglich ist. Wenn (zum Beispiel) es eine globale Variable ist, dann wird ja darauf zugegriffen werden. Wenn es dynamisch zugewiesen wird, müssen Sie seine Adresse an den Rest des Codes zurückgeben, um sie wissen zu lassen, wo sie sich befindet. Aber letztendlich haben Threads alle den gleichen Adressraum, also was Sie in einem Thread tun, können Sie ziemlich leicht für die anderen sichtbar machen. –

Verwandte Themen