Daten von laufendem Thread in Editfeld schreiben?
-
Maxi schrieb:
das hörtr sich so an, als würde in deinem threadproc hIP nicht definiert/deklariert/bekannt sein. Also: entweder hIP global machen (seeeehhhhhr schlechte Idee) oder versuchen, an das Handle des DIalogs zu kommen, das brauch man eigentlich überall und dann mit SetDlgItemText(hDlg, ID_EDITFELD, "Text"); Oder SetWindowText(GetDlgItem(hDlg, ID_EDITFELD), "Text"); dann füllen.
hi maxi, danke für die antwort.
du hast recht, hIP ist in dem threadproc nicht bekannt, es wird unter wndproc beim erstellen des fensters (wm_create) wie folgt definiert:
hIP = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "-", WS_CHILD | WS_VISIBLE | ES_READONLY, 250, 70, 150, 25, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL);deine beiden vorschläge hab ich schon probiert, aber es funktionierte auch nicht.
hatte es so getestet:
SetDlgItemText(hWnd, hIP, "test");aber ich denk mal das ist falsch. dann kommt nämlich beim kompilieren die meldung "C2065: 'hWnd': nichtdeklarierter Bezeichner" - gleiches auch für "hIP"
aber das ist ja auch kein dialog, deshalb funktioniert setdlgitemtext oder getdlgitem auch nicht. oder sehe ich das falsch?
-
Irgendwie scheint der Fall aber klar: Der Bezeichner hIP ist nicht deklariert. Hast Du irgendwo eine Zeile, die etwa so aussieht?
HWND hIP;
Falls nicht, solltest Du sie einfügen.
-
Du musst das HWND des Editfeldes an Deinen Thread übergeben, damit er drauf zugreifen kann...
-
hi,
ich habe gleich in wndproc stehen:
static HWND hIP;wie übergebe ich das an den thread?
-
bei Createthread kannst du einen user-parameter mit angeben, da kannst du das handle mitgeben. Wenn du mehrere daten übergeben willst, empfiehlt es sich , eine struktur zu machen und diese Struktur als zeiger zu übeergeben
-
wie wäre die syntax dafür?
-
So zum Beispiel:
struct SDeineDaten { HWND hWndDest; std::string strInfo; // usw. ... };Dann so (o.ä.) starten:
HANDLE hThread; DWORD dwThreadID; SDeineDaten ddThreadData; // ddThreadData-Struktur-Objekt initialisieren: ddThreadData.hWndDest = ...; // ... hThread = CreateThread(NULL, 0L, ThreadProc, reinterpret_cast<void*>(&ddThreadData), 0L, &dwThreadID);Der Parameter lpParam der Thread-Prozedur enthält dann eine Adresse auf deine Datenstruktur:
DWORD WINAPI ThreadProc( LPVOID lpParameter // -> Zeiger auf ddThreadData );
-
ok danke!
ich versuch es mal

-
hallihallo nochmal,
ich habs grad versucht, aber ich muß zugeben ich bin nicht durchgestiegen, sorry!
liegt vermutlich daran, daß ich noch nicht soooviel programmiererfahrung habe und bisher mit strukturen nicht gearbeitet habe. windowsprogrammierung und multithreading ist auch noch sehr neu für mich...
ich hab hier zwar das buch von charles petzold, da ist das auch erklärt, aber leider nicht so wie ich es gebrauchen kann...
vielleicht kann mir ja noch jemand bissel genauer erklären, wie das funktioniert mit dem übergeben?
ich lege den thread mit dem makro "_beginthread(VerbindungsThread, 0, NULL)" an, kann ich das beibehalten?
@codefinder: wofür steht das "HWND hWndDest" in deinem code?
was macht das "reinterpret_cast<void*>(&ddThreadData)"?nichtsdestotrotz bin dich für die bisher erhaltene hilfe dankbar!
vielleicht kann ja einer mal irgendein funktionierendes beispiel posten wenn möglich, dann ist das für mich vielleicht auch leichter verständlich. danke schonmal!
grüße
-
Firestarter81 schrieb:
@codefinder: wofür steht das "HWND hWndDest" in deinem code?
was macht das "reinterpret_cast<void*>(&ddThreadData)"?hWndDest ist der Fensterhandle deines Edit-Cointrols. Der wird deinem Thread übergeben.
Ein reinterpret_cast<Typ>(Ausdruck) ist eine explizite Typenumwandlung von Zeigern. Er entspricht dem C-Cast:(void*)&ddThreadDataDas ist äquvalent.
Firestarter81 schrieb:
ich lege den thread mit dem makro "_beginthread(VerbindungsThread, 0, NULL)" an, kann ich das beibehalten?
Also du kannst der CTR-Funktion _beginthread mehrere Parameter übergeben. Das ist hier wegen dem, Struct überflüssig...machs einfach so:
struct SDeineDaten { HWND hWndEdit; // Weitere Daten... }; // ... HANDLE hThread; DWORD dwThreadID; SDeineDaten ddThreadData; // ddThreadData-Struktur-Objekt initialisieren: ddThreadData.hWndEdit = ...; // ... // Thread starten: hThread = CreateThread(NULL, 0L, VerbindungsThread, reinterpret_cast<void*>(&ddThreadData), 0L, &dwThreadID); // Definition der Thread-Proc (VerbindungsThread): DWORD WINAPI VerbindungsThread(PVOID lpParam) { // zum Beispiel Text ermitteln: TCHAR szBuffer[500]; // nur statisch, da übersichtlicher GetWindowText(reinterpret_cast<SDeineDaten*>(lpParam)->hWndEdit, szBuffer, sizeof(szBuffer) / sizeof(TCHAR)); MessageBox(GetParent(reinterpret_cast<SDeineDaten*>(lpParam)->hWndEdit), szBuffer, TEXT("Info"), 0); return (EXIT_SUCCESS); }Hier nochmal n Beispiel: ClickMe
-
Firestarter81 schrieb:
ich lege den thread mit dem makro "_beginthread(VerbindungsThread, 0, NULL)" an, kann ich das beibehalten?
kannst du. da wo die NULL steht packste deinen pointer oder das HWND rein.
beispiel:void VerbindungsThread (void *p) { printf ("hallo: %s", p); } void main() { _beginthread (VerbindungsThread, 0, "<hier irgendwas eintragen>"); Sleep (INFINITE); }