Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben
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

Geschrieben
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.

Geschrieben

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

  • 1 Jahr später...
Geschrieben

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?

Geschrieben

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.

Geschrieben
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.

Geschrieben

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.

Geschrieben

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.

Geschrieben

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]

Geschrieben

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.

Geschrieben

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.

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...