Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Signal senden an childprocesse

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 <
000
26.02.2006, 12:43 Uhr
w-o-w-o



Hallo, ihr Wissenden,

ich komme mit folgendem Problem:

Ich habe mir eine c++ exe implementiert, die in der Konsole ausgeführt leicht und sauber mit dem Signal STRING-C beendet werden kann (auch eine adexit()- funktion ist implementiert).

Darauf habe ich mir unter visual studio in c++ eine GUI implementiert, mit der ich diese exe als ein childprocess (mit der Funktion ForkChildProcess) aufrufe.

Ich habe das Problem, dass ich von der GUI aus diesen Process, nicht sauber beenden kann! Mit TerminateProcess() wird die Funktion nur brutal abgeschossen und die adexit()- Funktion greift auch nicht.

Was ich gerne wissen würde:

Wie kann ich von meiner GUI aus an mein ChildProcess ein Signal: STRING-C senden???

Vielen Dank im voraus!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.02.2006, 15:04 Uhr
Spacelord
Hoffnungsloser Fall


Hi,meines Wissens nach dürfte deine mit atexit eingetragene Funktion bei nem Programmabruch über STRG+C überhaupt nicht aufgerufen werden?
Mit STRG+C erziehlst du den gleichen Effekt als wenn du von innerhalb deines Konsolenprozesses ExitProcess aufrufst. Da werden weder die Destruktoren für Objekte aus main aufgerufen noch werden die atexit Funktionen aufgerufen.
Um STRG+C sauber abzufangen schau dir mal SetConsoleCtrlHandler an und für dein anderes Problem wäre es eine Möglichkeit nen Thread zu starten der mit WaitForSingleObject auf nen Event wartet.Dieses Event könntest du von dem GUI Prozess aus signalisieren woraufhin der Thread im Konsolenprozess exit aufruft(wodurch zumindest die atexit Funktionen aufgerufen werden).

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.02.2006, 16:36 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wenn du dann über SetConsoleCtrlHandler einen Handler der Strg+C und Konsolenfenster-Close abfängt setzt, ruft er dann auch beim beenden deine funktion auf (da du da drin dann exit aufrufen musst)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.02.2006, 18:22 Uhr
w-o-w-o



Also,

ich muss korrigieren...

wenn ich mein childprocess als Konsolenanwendung starte, dann habe ich zum einen die Möglichkeit über STRG-C (SIGINT) ein Signal an die Anwednung zu schicken, dass sie auf vorgegebener Weise beendet wird.

Atexit() habe ich zusätzlich implementiert, um über GUI kontrolliert zu beenden.

nur zum zusammenfassen:

Wenn ich also von der Anwendung aus einen weiteren Thread starte und hier WaitForSingleObject ausführe, könnte ich von der GUI aus ein Signal absetzen, dass empfangen wird.
Wenn das Thread exit aufruft, wird auch gleichzeitig die Anwendung beendet und die atexit- Funktion greift?!

Aber wie sende ich von der GUI dieses Signal?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.02.2006, 22:29 Uhr
Spacelord
Hoffnungsloser Fall


Hallo,
also soweit wie ich bisher deine Anforderungen verstanden habe sieht eine mögliche Lösung etwa so aus.
Dein Konsolenprozess:

C++:
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <process.h>


typedef  unsigned(__stdcall *THREAD_FUNC)(void *) ;

void exit_func()
{
   printf( "Hallo aus der atexit Funktion!\n" );
}

unsigned thread_func(void* param)
{
    HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,"END_EVENT");
    WaitForSingleObject(hEvent,INFINITE);
    printf("Prozess wird beendet!\n");
    exit(7);

    return 0;
}

BOOL WINAPI close_handler(DWORD ctrlType)
{
    if(ctrlType == CTRL_C_EVENT)
    {
        printf("STRG+C gedrueckt\nBeende das Programm.\n");
        exit(8);
        return TRUE;
    }
    if(ctrlType == CTRL_CLOSE_EVENT)
    {
        printf("Close Event\nBeende das Programm.\n");
        Sleep(2000);
        exit(9);
        return TRUE;
    }
    return FALSE;
}

int main()
{
    int counter = 0;
    unsigned threadID=0;
    SetConsoleCtrlHandler(close_handler,TRUE);
    atexit(exit_func);
    unsigned long res = _beginthreadex(NULL,0,(THREAD_FUNC)thread_func,NULL,0,&threadID);
    while(true)
    {
        printf("%d \n",counter);
        ++counter;
        Sleep(1000);
    }
    return 0;
}



Und dein "GUI"-Prozess(der hier keiner ist,aber das tut der Sache keinen Abbruch )

C++:
#include <stdio.h>
#include <windows.h>
#include <conio.h>

int main()
{
    HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS,FALSE,"END_EVENT");

    printf("Taste druecken um den Prozess zu beenden");

    while(! _kbhit());

    SetEvent(hEvent);

    return 0;
}



Schau es dir mal an und probier es aus.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.02.2006, 22:45 Uhr
w-o-w-o



ich werd´es mal testen,
vielen dank für die Hilfe!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
28.02.2006, 20:10 Uhr
w-o-w-o



Servus, nochmal,


ich habe den Code getestet.... konte ich in mein Projekt integrieren und es funktioniert...

Danke nochmals
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
28.02.2006, 23:08 Uhr
Spacelord
Hoffnungsloser Fall


Schön wenn es funktioniert.
Um es aber sauber zu machen solltest du die Handles die du dir mit CreateEvent und OpenEvent besorgst auch wieder mit CloseHandle schließen.
Das hab ich in dem Beispiel vergessen.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: