TinTin Geschrieben 1. Juli 2003 Geschrieben 1. Juli 2003 hi, hab schon zu dem probem einiges gefunden. die suche im forum ergab das hier leider habe ich noch ein kleines problem. das Aufrufen eines programmes sowie das überwachen funktioniert ganz gut mit den u.a. code, jedoch möchte ich das programm, aus dem das zweite programm aufgerufen wird, nicht blockiert wird, wärend das zweite programm läuft. ich möchte mit beiden programme arbeiten können, das erste soll jedoch mitbekommen, wenn das zweite geschlossen wird. void COPDlg::OnNotepad() { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( π, sizeof(pi) ); // Start the child process. if( !CreateProcess( NULL, // No module name (use command line). "notepad.exe c:\\win.ini", // Command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. 0, // No creation flags. NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. π ) // Pointer to PROCESS_INFORMATION structure. ) { AfxMessageBox( "CreateProcess failed." ); exit(1); } DWORD dwExitCode; do { GetExitCodeProcess(pi.hProcess,&dwExitCode); } while (dwExitCode == STILL_ACTIVE); if (dwExitCode != STILL_ACTIVE) AfxMessageBox("beeendet"); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } ciao TinTin Zitieren
Guybrush Threepwood Geschrieben 1. Juli 2003 Geschrieben 1. Juli 2003 Hi, du könntest die Abfrage ob das andere Programm noch läuft in einen 2. Thread packen, dann ist dein Hauptthread damit nicht belastet. Vielleicht interresiert dich dabei auch dieses Thema. Gruß Guybrush Zitieren
TinTin Geschrieben 1. Juli 2003 Autor Geschrieben 1. Juli 2003 Original geschrieben von Guybrush Threepwood Vielleicht interresiert dich dabei auch dieses Thema. ich hab den thread schon gesehen und in einen anderen version verwendet. mein vorrangiges problem ist, dass ich das erste programm mit dem der aufruf gestartet wird, wärend das 2. programm läuft, nicht benutzen kann. wie kann ich denn den aufruf starten, so dass ich mit beiden programmen arbeiten kann??? die geschichte mit der CPU auslastung hab ich schon gesehen und an einer anderen stelle gelöst... ciao TinTin Zitieren
Guybrush Threepwood Geschrieben 1. Juli 2003 Geschrieben 1. Juli 2003 Original geschrieben von TinTin mein vorrangiges problem ist, dass ich das erste programm mit dem der aufruf gestartet wird, wärend das 2. programm läuft, nicht benutzen kann. wie kann ich denn den aufruf starten, so dass ich mit beiden programmen arbeiten kann??? Probier doch mal das 2.Programm und die Abfrage ob es noch läuft in einem 2.Thread zu starten. Zitieren
TinTin Geschrieben 1. Juli 2003 Autor Geschrieben 1. Juli 2003 werde ich versuchen... kannst du mir auch einen tip geben, wie ich das am besten mache??? ich würde mich freuen!!! ciao TinTin Zitieren
TinTin Geschrieben 1. Juli 2003 Autor Geschrieben 1. Juli 2003 so, hab was zu den threads gefunden, weiss aber nicht genau, wie ich jetzt meinen programmaufruf da rein bekomme. HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes DWORD dwStackSize, // initial thread stack size LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function LPVOID lpParameter, // argument for new thread DWORD dwCreationFlags, // creation flags LPDWORD lpThreadId // pointer to receive thread ID ); muss ich zuerst mit CreateTread() einen Thread erstellen und das Handle was ich dann bekomme, zum erstellen eines neuen prozesses nutzen, oder kann ich den programmaufruf auch direkt mit CreateThread() erschlagen??? LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function der sinn und zweck dieser zeile bleibt mir etaws verborgen. kann mir jemand dazu einen tip geben??? ciao TinTin Zitieren
Guybrush Threepwood Geschrieben 3. Juli 2003 Geschrieben 3. Juli 2003 Bitte: DWORD WINAPI Threadfunc(LPVOID) { //hier deinen Code einfügen } DWORD dwThreadId; //im Hauptprogramm: CreateThread(NULL,NULL,Threadfunc,NULL,NULL,&dwThreadId); [/PHP] Zitieren
TinTin Geschrieben 7. Juli 2003 Autor Geschrieben 7. Juli 2003 :uli na wunderbar, manchmal reicht ein kleiner oder etwas grösserer impuls aus und schon klappt es. ciao TinTin Zitieren
TinTin Geschrieben 7. Juli 2003 Autor Geschrieben 7. Juli 2003 :uli na wunderbar, manchmal reicht ein kleiner oder etwas grösserer impuls aus und schon klappt es. ciao TinTin Zitieren
Narf! Geschrieben 1. November 2004 Geschrieben 1. November 2004 Bei mir klappt es so nicht. Die Arbeits-Funktion: UINT [Program]Dlg::ArbeitsFunktion(LPVOID) { ... tut was ... return 0; } Aufruf im Programm: DWORD dwThreadId=0; CreateThread(NULL, NULL, ArbeitsFunktion, NULL, NULL, &dwThreadId); Die Fehlermeldung: ?:\[Program].cpp(702) : error C2664: 'CreateThread': Konvertierung des Parameters 3 von 'UINT (LPVOID)' in 'LPTHREAD_START_ROUTINE' nicht möglich Keine Funktion mit diesem Namen im Gültigkeitsbereich stimmt mit dem Zieltyp überein Was ist daran falsch, wenn es doch oben so geht? Zitieren
Klotzkopp Geschrieben 1. November 2004 Geschrieben 1. November 2004 Die Threadfunktion darf keine nichtstatische Memberfunktion sein. Zitieren
Narf! Geschrieben 2. November 2004 Geschrieben 2. November 2004 Ich habe die Funktion als static deklariert, der selbe Fehler tritt immer noch auf und jetzt bekomme ich Probleme mit der ListCtrl-Variable: [Program].cpp(1038): error C2228: Der linke Teil von '.GetItemCount' muss eine Klasse/Struktur/Union sein;Typ ist '' Mit der Funktion durchlaufe ich ein CListCtrl von oben nach unten. Zitieren
Klotzkopp Geschrieben 2. November 2004 Geschrieben 2. November 2004 Ich habe die Funktion als static deklariert, der selbe Fehler tritt immer noch auf Deklariere die Funktion als static DWORD WINAPI Dlg::ArbeitsFunktion(LPVOID). Ist dir klar, dass du in einer statischen Memberfunktion keinen Zugriff auf nichstatische Member hast? Wenn du einen Zeiger auf eine Dlg-Instanz brauchst, kannst du den im 4. Parameter von CreateThread übergeben. Dieser Zeiger landet dann als LPVOID-Parameter in der Threadfunktion. Da steht doch bestimmt noch ein anderer Fehler davor, oder? Es es übrigens immer hilfreich, auch den Code zum Fehler zu zeigen. Nachtrag: Wenn du im Thread Funktionen der Laufzeitbibliothek benutzen willst, solltest du eher _beginthreadex als CreateThread benutzen. Wenn du die MFC benutzt, würde sich AfxBeginThread anbieten. Zitieren
Narf! Geschrieben 2. November 2004 Geschrieben 2. November 2004 Jetzt sieht es so aus: Ich habe die Funktion als static DWORD WINAPI Dlg::ArbeitsFunktion(LPVOID pParam); deklariert. Als Aufruf habe ich AfxBeginThread(ArbeitsFunktion, &m_c[ListCtrl], 0, 0, 0, 0);. Folgende Fehlermeldung bekomme ich jetzt: [Program]Dlg.cpp(1020): error C2665: 'AfxBeginThread': Durch keine der 2 Überladungen kann Parameter 1 vom Typ 'DWORD (LPVOID)' konvertiert werden e:\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxwin.h(4105): kann 'CWinThread *AfxBeginThread(AFX_THREADPROC,LPVOID,int,UINT,DWORD,LPSECURITY_ATTRIBUTES)' sein bei Anpassung der Argumentliste '(overloaded-function, CListCtrl *__w64 , int, int, int, int)' Und der o.g. Fehler bleibt der selbe. Zitieren
Klotzkopp Geschrieben 2. November 2004 Geschrieben 2. November 2004 Für AfxBeginThread brauchst du jetzt wieder UINT, nicht DWORD, als Rüclgabetyp. Zitieren
Narf! Geschrieben 3. November 2004 Geschrieben 3. November 2004 Das hat nur soweit geholfen, dass ich jetzt nur noch die Fehlermeldung mit der ListCtrl-Variable bekomme. Deklaration: static UINT ArbeitsFunktion(LPVOID); Aufruf: AfxBeginThread(ArbeitsFunktion, &m_cSmiley, 0, 0, 0, 0); Fehler: Der linke Teil von '.GetItemCount' muss eine Klasse/Struktur/Union sein "m_cSmiley.GetItemCount();" in einer for-Schleife. Weder mit &m_cSmiley noch ohne & hat es etwas gebracht. Zitieren
Klotzkopp Geschrieben 3. November 2004 Geschrieben 3. November 2004 Ich sagte doch, in der Threadfunktion hast du keinen Zugriff auf nichstatische Member. m_cSmiley ist ein nichtstatischer Member. Ich sagte auch, dass der Zeiger, den du bei AfxBeginThread übergibst, als LPVOID-Parameter in der Threadfunktion landet. Dumusst dann deinen ListControl-Zeiger wieder aus dem void-Zeiger rausholen: UINT Dlg::ArbeitsFunktion(LPVOID param) { CListCtrl* pMeinListCtrl = reinterpret_cast<CListCtrl*>(param); pMeinListCtrl->GetItemCount(); // usw. }[/CODE] Zitieren
Narf! Geschrieben 3. November 2004 Geschrieben 3. November 2004 Es war wieder eine schwere Geburt. Es funktioniert jetzt. Danke für die Geduld. Zitieren
Narf! Geschrieben 3. November 2004 Geschrieben 3. November 2004 Und wieder mal zu früh gefreut... :confused: Ich möchte das Ende des Threads abwarten und erst dann weitermachen. Den Thread habe ich gestartet, um die Dialoganzeige aktuell zu halten. Ich habe folgendes Beispiel aus der MSDN angepasst: ... CWinThread* pThread=0; DWORD exitCode=0; ... pThread=AfxBeginThread(ArbeitsThread, &m_cSmiley, 0, 0, 0, 0); pThread->m_bAutoDelete=false; do { GetExitCodeThread(pThread->m_hThread, &exitCode); } while(exitCode==STILL_ACTIVE); AfxEndThread(0, true); ... Nur bleibt er in der do-while-Schleife stecken und führt den Thread bzw. dessen Funktion nicht aus. Ich habe hier den Tipp gefunden, in die Schleife ein Sleep() einzubinden. Das hat auch nicht geholfen. Und noch ein Hinweis: Verschiedene Themen-Links sind nicht mehr zu erreichen. Zitieren
Klotzkopp Geschrieben 3. November 2004 Geschrieben 3. November 2004 Der Thread wird vermutlich ausgeführt, du siehst nur nichts davon, weil deine Schleife, in der du auf das Ende des Threads wartest, die Nachrichtenschleife deines Fensters blockierst. Damit bist du wieder am Anfang, denn die blockierte Nachrichtenschleife war ja der Grund für den Thread. Ich sehe da zwei Möglichkeiten: 1. Der Thread schickt, wenn er fertig ist, eine benutzerdefinierte Nachricht an das Fenster, damit es weitermachen kann. 2. Das Fenster prüft in einer Timer-Funktion regelmäßig, ob der Thread beendet ist, und macht dann weiter. Zitieren
Narf! Geschrieben 4. November 2004 Geschrieben 4. November 2004 Ich habe Variante 2 mit SetTimer() genommen und es funktioniert. Dazu eine Frage: Kann ich in der OnTimer()-Funktion ein weiteres SetTimer() aufrufen? Denn das habe ich versucht, aber der neue Timer wurde nicht angesprochen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.