Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Wie bekomme ich den "hanle" meines Dialogfensters ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
14.11.2002, 17:00 Uhr
~Micha
Gast


Hallo Forumsteilnehmer ,

ich komme nicht weiter bitte um eure Hilfe,

in meine ProgrammDlg.cpp habe ich folgende Funktion


C++:
DWORD WINAPI ProgressValue(LPVOID ThreadId)
{
    long    Wert;
    for (;;)
    {    Wert = getProgress(*(int *)ThreadId);
        printf ("\r%d", Wert);
        SetDlgItemText(XXXXXX,IDC_MELDUNGEN,"Bitte warten...");
        Sleep (200L);
    }
    return 0L;
}



Die Funktion getProgress() holt sich von einer DLL den Progresswert.
Den kann ich auch mit printf() anzeigen lassen. Ich möchte aber das
der Wert in meinem grafischen Objekt IDC_MELDUNGEN erscheint.


Das Objekt IDC_MELDUNGEN kann sonst immer ansprechen.
In diesem Fall bekomme ich vom Compiler die Meldung
"Funktion akzeptiert keine 2 Parameter" wenn ich einen dritten Parameter
eingebe dann bekomme ich die Meldung "nichtdeklarierter Bezeichner" oder Falsche handle.

Wie bekomme ich den richtigen handle meines Dialogfensters damit im diesen Feld was
schreiben kann ???

Danke.

Editiert von void*: Code-Tags eingefügt, Smilies aus

Dieser Post wurde am 14.11.2002 um 17:29 Uhr von void* editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.11.2002, 17:29 Uhr
Volle



Hallo Micha,

du versuchst eine Memberfunktion deiner Dialogklasse außerhalb des Gültigkeitsbereiches selbiger aufzurufen. Das funktioniert nicht bzw. nicht so.

Wenn du statt dessen


C++:
CDeinDlg::SetDlgItem(...,...);


schreiben würdest, dann würde er es vermutlich anstandlos akzeptieren (mit 2 Parametern). Nur laufen würde es immer noch nicht.

Am einfachsten wird es sein, wenn du deiner Funktion einen 2. Parameter mit dem Handle mitgibst.

Etwa so:


C++:
DWORD WINAPI ProgressValue(LPVOID ThreadId, HWND hDlg);


Aufrufen musst du das dann so:


C++:
long ret = ProgressValue(m_threadId, this->m_hWnd);


m_hWnd setzt du dann bei SetDlgItem als ersten Parameter ein. Ich gehe davon aus, dass du diese Funktion innerhalb deiner Dialogklasse aufrufst.

Gruß, Volle.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.11.2002, 13:49 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,
ich denke das er ProgressValue in einem eigenen Thread startet ...
Falls ja, würde ich folgendes machen:


C++:
struct ThreadData {
  int thread_id;
  HWND hWnd;
};

DWORD WINAPI ProgressValue(LPVOID ThreadId)
{
    ThreadData *td= (ThreadData *)ThreadId;

    long    Wert;
    for (;;)
    {
        Wert = getProgress(td->thread_id);
        printf ("\r%d", Wert);
        SetDlgItemText(td->hWnd,IDC_MELDUNGEN,"Bitte warten...");
        Sleep (200L);
    }
    return 0L;
}



Aufrufen musst du das ganze (als eigener Thread) so:


C++:
ThreadData td;
td->thread_id = 0;
td->hWnd = this->m_hWnd;
AfxBeginThread(ProgressValue,&td);


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.11.2002, 16:03 Uhr
~Micha
Gast


Danke für die Antworten.
Teils hat es Funktioniert ich bekomme keine Meldung vom Kompiler und ich
kann die Anwendung ausführen.

Eins Funktioniert aber nicht: Der Progresswert wird nicht angezeigt sondern nur einmal wenn der Tread beendet wird.
(Der ProgressWert erscheint ich habe den in ein File geschrieben um es zu überprüfen)

Was habe ich vergessen zu aktivieren ? warum sehe ich nicht den Wert auf mein Anzeigeobjekt.
Hier nocmals der Code.

/*-------------------------------------------------*/
DWORD WINAPI ProgressValue(LPVOID ThreadId)
{
long Wert; char text[80];

for (;
{ Wert = getProgress(1);
if (Wert >= 100)
{ break;
}
else
{ sprintf (text,"%d ", Wert);
SetDlgItemText(td.hWnd,IDC_MELDUNGEN,text);
}
Sleep (200L);
}
fclose(stream);
return 0L;
}
/*-------------------------------------------------*/

Danke Micha.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.11.2002, 17:51 Uhr
Volle



Hallo Micha,

ich gehe mal immer noch davon aus, dass ProgressValue nicht in einem eigenen Thread läuft. Vermutlich läuft die Funktion mit im Hauptprozess, in welchem du mit


C++:
SetDlgItemText(td.hWnd,IDC_MELDUNGEN,text);



auch den Wert ausgibst. IDC_MELDUNGEN ist vermutlich ein Editfeld, oder? Und genau das ist das Problem.

Die for- Schleife "blockiert" die Messageverarbeitung des Hauptprozesses. Also wird dein Editfeld erst wieder aktualisiert, wenn diese beendet ist. Da hilft auch das Sleep nichts, weil das nur für "fremde" Prozesse CPU- Zeit zur Verfügung stellt.

Du hast zwei Möglichkeiten. Du kannst in deiner for- Schleife die Messages explizit weiterleiten. Das wäre prinzipiell die saubere, richtige Lösung. In deinem Fall ist es aber einfacher, das Editfeld in einen Static- Text zu verwandeln (Mit gleicher ID usw., dann brauchst du das nur im Ressourceneditor kurz ändern.) Bei Statics geht es nämlich auch so, weil es nicht auf die Nachrichtenverwaltung angewiesen ist. Warum weiß ich jetzt blöderweise gerade nicht mehr. Ich kann aber nachschauen. Vielleicht liest das hier ja auch jemand, der mit API recht fit ist. Der müsste das dann auch wissen und postet es vielleicht.

Du weißt ja, dass man ein Static im Ressourcen- Editor so einstellen kann, dass es aussieht wie ein Editfeld.

Und wenn du ein Beispiel für die Weiterleitung von Nachrichten brauchst, dann sag Bescheid.

Grüße, Volle.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.11.2002, 10:33 Uhr
~Micha
Gast


Hallo Volle,

"ProgressValue" läuft in einem eigenen Thread und holt jede 200 msec
einen Fortschritswert (ProgressWert) mit der Funktion "Wert=getProgress(1);".
Diesen Wert möchte ich anzeigen es ist ein Wert zwischen 0 und 100.

ich habe es mit dem Static Feld ausprobiert leider ohne Erfolg !
Könntest du mir die andere Lösung bekanntmachen oder hättest du eine bessere Idee ?

Viellen Dank nochmals
Micha.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.11.2002, 11:14 Uhr
Volle



Hallo Micha,

das war dumm von mir! Das m it dem Thread ist ja eigentlich klar gewesen. Aber dann verstehe ich ehrlich gesagt nicht, wieso das nicht geht.

Wie startest du den Thread? Kannst du das mal posten?

Gruß, Volle.

Dieser Post wurde am 25.11.2002 um 11:15 Uhr von Volle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.11.2002, 11:43 Uhr
~Micha
Gast


Hallo Volle,

hier der Code, wird ausgeführt nachdem ich auf meinen "Berechnen" Button gedrückt habe:

{
td.thread_id = 0;
td.hWnd = this->m_hWnd;
HANDLE hndProgress;
DWORD ThreadIdProgress;
hndProgress = NULL;
ThreadId = 1L;

hndProgress = ::CreateThread(NULL, 0L, ProgressValue, (LPVOID)&ThreadId, 0L, &ThreadIdProgress);
if (!hndProgress)
{ SetDlgItemText(IDC_ERGEBNIS_FENSTER, "Kann Thread nicht erzeugen !!");
return ;
}
ThreadId = 1L;
if (Fehler = getBerechnung(ThreadId, LogDatei, AnzahlDateien+1, Namenskette))
{ sprintf(textbuff,"\n*** Fehler aufgetretenn%s\n", getErrorMessage(Fehler));
SetDlgItemText(IDC_MELDUNGEN, textbuff);
}

SetDlgItemText(IDC_MELDUNGEN, "Procces is finish.");
CloseHandle(hndProgress);
}

Die Funktion getBerechnung(ThreadId, LogDatei, AnzahlDateien+1, Namenskette) führt eine Berechnung durch davor erzeuge ich einen Thread
"CreateThread(NULL, 0L, ProgressValue, (LPVOID)&ThreadId, 0L, &ThreadIdProgress);"
damit ich dann den ProgressWert der Berechnung abfragen kann den ich auch anzeigen möchte.

Ich hoffe ich habe es ausdrücklich machen können.
Danke für deine Tipps
Gruß Micha.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.11.2002, 16:43 Uhr
Volle



Hallo Micha,

habe ich das jetzt richtig verstanden? Dein Hauptprozess führt eine Berechnung aus und du startest einen Thread, der den Fortschritt deiner Berechnung im Hauptthread dokumentieren soll.
Wenn es so ist, dann würde ich sagen, deine Hauptthread ist mit der Berechnung beschäftigt und kann deshalb den Fortschritt nicht anzeigen.

Du solltest hier genau andersrum vorgehen. Die Berechnung gehört in einen eigenen Workerthread. (BTW: Threads startet man in MFC mit AfxBeginThread aber CreateThread ist im Prinzip auch nichts anderes.)

Aber wenn es wirklich nur um die Fortschrittsanzeige geht, dann ist ein Thread eigentlich nicht nötig.

Dieser Code:


C++:
for (int i = 0; i < 100; i++)
{
    Sleep(100)
    /*CString*/ sBuf.Format("%u", i);
    SetDlgItemText(IDC_MY_STATIC, sBuf);
}


aktualisiert dir ein Static während des Schleifendurchlaufs.

Ein Edit- Feld läßt sich so ähnlich realisieren:


C++:
MSG msg;

    for (int i = 0; i < 100; i++)
    {
        Sleep(100);
        /*CString*/ sBuf.Format("%u", i);
        SetDlgItemText(IDC_MY_EDIT, sBuf);

        if (GetMessage(&msg, this->m_hWnd, WM_PAINT, WM_PAINT))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }


Das muss ich daheim aber nochmal kurz nachschauen. Das war jetzt Blindflug.

Hope it helps...

Gruß, Volle.

Dieser Post wurde am 25.11.2002 um 16:48 Uhr von Volle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
26.11.2002, 15:40 Uhr
~Micha
Gast


Hallo Volle,

>Wenn es so ist, dann würde ich sagen, deine Hauptthread ist mit der >Berechnung beschäftigt und kann deshalb den Fortschritt nicht anzeigen.

Du hast recht, wie dumm von mir. Jetzt hat es funktioniert.
Die Werte von 1 bis 100 erscheinen.

Wie einfach kann ich diesen "Wert" in einem Fortschritsbalten (PrograssBar)
einbinden ?? Ich habe ein Stausobjekt in meiner Oberfläche erzeugt wie kann
dieses mit Wert füllen.

Danke nochmals
Micha
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: