Threads hier eine Lösung?
-
Hi,
ich habe ein klitzekleines Problem bei dem ich nicht weiter komme:
Ich habe einen Button, wenn dieser Betätigt wird, wird eine SQL-Datenbankabfrage gestartet um diverse Daten zu bekommen, zuvor aber eine eigene Fensternachricht gesendet um diesen Befehl auszuführen. Jetzt habe ich auf dem Hauptfenster wo der Button drauf ist einen Text den ich mit DrawText ausgebe so als Informationsstatusbar.
Soweit sogut.
Betätige ich den Knopf wird folgende Funktion aufgerufen:
bool checkData (void) { // Verbinde zur Datenbank g_infobartext = "Verbindung zur Datenbank hergestellt"; InvalidateRect (hwnd, NULL, true); // [SQL KRAM FÜR VERBINDUNG RAUSGEWORFEN] // Tabelle auswählen g_infobartext = "Tabelle selektiert"; InvalidateRect (hwnd, NULL, true); // [SQL KRAM FÜR TABELLENAUSWAHL RAUSGEWORFEN] // usw. }Ich setze hier bevor ich die SQL-Abfragen starte den Text für die Infobar und will dann das Fenster neu zeichnen lassen, doch genau da ist der Knackpunkt!
Das Programm ruft nicht die WM_PAINT auf sondern erst dann wenn die Funktion beendet wurde und bis dahin steht der User da und sieht nicht was passiert, da der Statustext nicht während den einzelnen SQL-Befehlen aktuallisiert wird

Würden hier Threads was bringen? Ich habs mit _beginthread und _endthread ausprobiert doch die warten auch alle

Wie kann ich es schaffen das das Programm in der Zeit wo die Abfragen stattfinden nicht einfriert und so lange die däumchen dreht bis die SQL-Abfrage erfolgreich war oder fehlgeschlagen ist?

-
Mach einen Thread wo die SQL Funktionalität gehandhabt wird und der Hauptthread macht die UI.
-
Könntest Du das etwas genauer verdeutlichen?
-

-
Teflon13 schrieb:

War doch nur eine ganz normale bitte? Mein Gott, musst du dich deshalb so angepinkelt fühlen? Bin halt nicht so ein Pr0 wie du! Meine Fresse, das Forum hier wird auch immer unfreundlicher.
-
gibt es hier eine nettere und qualifiziere Person die mir das Thema etwas verdeutlichen kann ohne es in 1-2 Sätzen zu erklären?
-
Teflon13 meinte: Erstell einen Thread, in dem du die bool checkData (void)
funktion drin am laufen hast, und eine, in dem du den rest machst... dann kannst du den rest unabhängig zu checkData aktualliesieren -.-
-
was meinst du mit rest? das programm läuft doch schon in einem Thread?
Oder könntest du das ggf. hierarisch darstellen?

-
*push*
-
Einfach UpdateWindow(hwnd); nach InvalidateRect aufrufen und schon wird das Fenster sofort neu gezeichnet.
Nur damit es einmal neu gezeichnet wird ist ein Thread etwas überdimensioniert, aber dafür würde das Fenster dann auch auf alle Benutzereingaben reagieren können und es würde neu gezeichnet werden, wenn dein Fenster während der SQL-Abfrage kurzzeitig überdeckt wird.
-
Der Thread sollte dem Fenster lieber Nachrichten schicken und dann kann das Fenster selbst entscheiden was es tut.
-
Tut InvalidateRect nicht WM_PAINT senden? Wenn ich mit SendMessage WM_PAINT sende kommt nix

-
Nein, UpdateWindow tut das.
-
Ich meinte es so. Wenn der Thread die Verbindung zur Datenbank herstellt, sendet er dem Fenster eine Nachricht WM_CONNECTING_TO_DATABASE
Und dann macht das Fenster:
case WM_CONNECTING_TO_DATABASE: InvalidateRect(...); return 0;
-
geht net

-
''''''''''''''''''''''''' schrieb:
Tut InvalidateRect nicht WM_PAINT senden? Wenn ich mit SendMessage WM_PAINT sende kommt nix

InvalidateRect sendet keine Nachricht, es erklärt ledigleich einen Teil des Anwendungsbreichs als ungültig. WM_PAINT kann man nicht einfach so mit SendMessage senden. UpdateWindow ist dazu da, WM_PAINT zu generieren. Versuch es halt mal.
-
Bei InvalidateRect() sendet Windows meistens ne WM_PAINT-Nachricht, aber nicht notwendigerweise sofort. Mit UpdateWindow() stellt man quasi sicher, dass ne WM_PAINT generiert wird.
-
geeky schrieb:
Bei InvalidateRect() sendet Windows meistens ne WM_PAINT-Nachricht, aber nicht notwendigerweise sofort. Mit UpdateWindow() stellt man quasi sicher, dass ne WM_PAINT generiert wird.
Ich würde sagen InvalidateRect sendet nie eine WM_PAINT Nachricht sondern das geschieht immer in GetMessage/PeekMessage.
-
geeky schrieb:
Bei InvalidateRect() sendet Windows meistens ne WM_PAINT-Nachricht, aber nicht notwendigerweise sofort.
Windows sendet sie genau dann, wenn die Nachrichtenwarteschlange leer ist. Da diese aber nicht weiter abgerabeitet wird, bevor die SQL-Abfrage fertig ist, kann sie mit UpdateWindow sofort erzeugt werden.
edit:
@meinung: genau
-
Aber wenn er doch einen Thread dafür benutzt dann wird sie doch abgearbeitet!!