DialogBox-Problem



  • Wie funktioniert das eigentlich mit den Dialog-Boxen, wenn ich etwas während die Dialog-Box angezeigt wird, berechnen will?
    Also ich starte die Dialogbox mit der Funktion DialogBox. Aber dann wird doch der Prozess angehalten! Ich möchte z.B. die Zeit angeben. Dann müsste ich sie jedes mal berechnen und dann in der Dialogbox ausgeben. Wie macht man das?



  • Indem man nichtmodale Dialogboxen verwendet oder die Berechnung innerhalb der Dialogbox in einem Thread ausführt



  • Du kannst doch auch einen Timer verwenden. Modal heißt nur, daß das Elternfenster für Benutzereingaben gesperrt ist. Nachrichten verarbeitet es nach wie vor. Es hat auch nichts mit dem Prozess zu tun. Der läuft ganz normal weiter.



  • du hast doch, wenn du eine dialogbox mit DialogBox() anzeigst, ne FUnktion für diese Dialogbox übergeben, die alles managed.. die funktioniert imho genauso wie die WindowProc bei einem Normalen fenster. jetzt tust du einfach folgendes: du hast nen button in deiner dialogbox mit nem knopf. wenn der knopf gedrückt wird, dann berechnest du einfach das, was du berechnen willst, also machst du den code bei die abfrage:

    [..]
    case WM_COMMAND:
    {
    switch(LOWORD(wParam))
    {
    case IDCALC:   //Bezeichnung von deinem Button
    {
    //Hier schreibst du deinen code hin, was er tun soll, wenn der Berechnen - Buton gedrückt wird..
    }break;
    }
    }break;
    [..]
    

    hoffe dir geholfen zu haben

    cya



  • Das würde in meinem Fall nicht funktionieren, da ich etwas ständig zählen muss.
    Was sind denn "nichtmodale Dialogboxen"? Wie macht man denn diese?



  • also ich weiß jetzt, wie ich es schaffe eine nichtmodale Dialogbox zu erstellen: CreateDialog.
    Allerdings bleibt noch ein Problem:
    Wenn ich danach eine Endlosschleife mache, dann reagiert die Dialogbox nicht mehr und ich kann sie nicht mehr beenden!(es wird eine Sanduhr angezeigt) Wie löse ich das?



  • Original erstellt von RenéG:
    Indem man [...] die Berechnung [...] in einem Thread ausführt

    s.o.



  • geht das nicht anders? Muss das in einem Thread stattfinden?



  • ok. Ich habe es jetzt mit einem Thread gemacht.
    Das Programm sieht jetzt so aus:

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include "resource.h"
    #include <string>
    #include <windowsx.h>
    #include <stdio.h>
    
    BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM) ;
    
    HWND hWndDlg=NULL;
    FILE *pfile;
    HANDLE hThread;         
    DWORD  dwThreadID;  
    
    DWORD WINAPI ThreadFunc(LPVOID data)
    {
        pfile=fopen("hallo.txt","w");
    
        while(true)
        {
            static int i=0;
            static int c=0;
            i++;
            if(i>1000)
            {
                fprintf(pfile,"%d\n",c++);
                i=0;
            }
        }
    
        fclose(pfile);
    } 
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        hThread= CreateThread(NULL, 0,  ThreadFunc, (LPVOID)0,0,&dwThreadID);   
        DialogBox(hInstance, MAKEINTRESOURCE(ID_DIALOG1), NULL, (DLGPROC)DialogProc);
        return 0;
    }
    
    BOOL CALLBACK DialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {     
         switch (message)
         {
            case WM_INITDIALOG:
                return TRUE;
    
            case WM_CLOSE:
                EndDialog(hwnd,0);
                CloseHandle(hThread);
                return TRUE;
         }
    
         return FALSE;
    }
    

    Nur wie kann ich jetzt eine Message (aus der Thread-Funktion) an meine Static-Textfeld aus meiner Dialogbox senden?



  • Erstmal: Benutz statt CreateThread den Wrapper BeginThread, dann solltest du in den Projekt-Optionen angeben, dass es eine Multithread-Anwendung ist.

    Dann kannst du auf das Static auch aus dem Thread raus zugreifen, du solltest den Zugriff nur threadsafe machen und CriticalSections benutzen, sonst kann es passieren, dass es kracht.



  • was muss man denn da beachten?



  • Wie kann ich denn mein Programm Threadsicher machen?



  • Wie kann ich denn das HWND einer Dialogbox bekommen, wenn ich sie mit der Funktion DialogBox() erstellt habe?



  • Original erstellt von <SlimTimmy>:
    Wie kann ich denn mein Programm Threadsicher machen?

    In dem di, wie ich schon gesagt habe, CriticalSections benutzt.



  • *push*
    Wie kann ich denn nun das HWND des Dialogs bekommen?



  • das handle bekommst du doch in der DlgProc



  • eigentlich wollte ich es so machen, dass ich mir im Thread dann das HWND hole, damit ich keine globale Variablen brauche. Wenn man WinAPI-Funktionen aufruft, sind die dann Threadsicher?


Anmelden zum Antworten