stefs Lösung ist ganz und gar nicht zu empfehlen! Schaut lieber in der FAQ unter "Löschen" im Index nach, da findet ihr zwei viel bessere Möglichkeiten!
MfG SideWinder
such auch gleich nach Sockets Tutorials bei Google.
und bei Windows gibt es die Funktion WSAAsyncSelect(). überwacht mehrere verbindungen. sowie die berkley-funktion select().
einfach mal googeln.
ähm ich hab das jetzt erstmal so gelöst ->
DWORD CRfcDlg::ReadAndHandleOutput(HANDLE hPipeRead,CString& out)
{
char lpBuffer[1024];
lpBuffer[0]='\0';
DWORD err;
DWORD nBytesRead;
nBytesRead = GetFileSize(hPipeRead,NULL);
//schau ob daten im stdout buffer des prozesses liegen
if(nBytesRead==0xFFFFFFFF||nBytesRead==0x00000000)
{
//wenn keine daten vorhanden sind oder ein fehler aufgetreeten ist
//wird der prozess 'angepingt'
//einfach ein datenpacket gesendet und überprüft obs ankommt oder
//die pipe zusammen gebrochen ist
DWORD nBytesWrote;
char read_buff[]="ping";
WriteFile(list.getcurrentknoten()->hOutWrite,read_buff,nBytesRead,&nBytesWrote,NULL);
return GetLastError();
//gibt den fehlercode zurück
}
else
{
PeekNamedPipe(hPipeRead,lpBuffer,sizeof(lpBuffer),&nBytesRead,NULL,NULL);
//wenn daten gefunden wurden werden diese ausgelesen
//und noch nicht aus dem buffer gelöscht
err = GetLastError();
if(err==ERROR_NO_DATA)
{
//wenn die pipe zusammen gebrochen ist wird ERROR_NO_DATA zurückgegeben
delFromList(list.getcurrentknoten()->id);
return err;
}
lpBuffer[nBytesRead]='\0';
out=lpBuffer;
//sucht den zeilenumbruch. somit wird eine zeilenweises auslesen garantiert
if(int tI=out.FindOneOf("\r\n"))
{
ReadFile(hPipeRead,lpBuffer,tI+2,&nBytesRead,NULL);
//liest und löscht die daten aus dem buffer bis zu dem gefundenen zeilenumbruch
}
//wenn daten gelesen wurden werden diese in die out var. geschrieben
//und die funktion mit NO_ERROR beendet
lpBuffer[nBytesRead]='\0';
out=lpBuffer;
}
//delete lpBuffer;
return NO_ERROR;
}
kann mir das vieleicht einer etwas optimieren ?
wenn ich nu mehrere prozesse starte kanns vorkommen das er manches doppelt ausliest ?!? warum auch imma
es ist prinzipiell möglich die Datei zu verändern. Man sollte hier zwei Sachen unterscheiden:
Das laufende Programm (RAM)
Die .exe Datei (HDD)
Das Programm wird beim starten vom OS aus der .exe ins RAM kopiert und dann gestartet.
D.h. dein Programm könnte wie oben erwähnt über ne große datenstruktur verfügen, die dann sowohl in der .exe als auch im prog (RAM) vorhanden ist. Dein Prog könnte dann die eingelesenen Daten, in die Datei schreiben, und würde somit die Initialisierungswerte für deine große Struktur ändern.
(smc ist etwas _KOMPLETT_ anderes)
mfg
-bg-
Du kannst in Windows XP nur port steuern über API also Windows Function und nicht ANSI function denn du bist in ein system der in PMODE leuft und die hardware implementierung liegt in kernel der system und Windows XP verbietät das man auf niedrigeren Ring zugreifen kann ..
also API Pogrammieren ..
cu
class xxx
{
public:
xxx (); // Konstruktor
private:
int variable;
int variable2;
};
xxx::xxx ()
:
variable ( WERT ),
variable2 ( WERT )
{
}
Wäre eine Möglichkeit. Ist aber alles Standard-C++ - dorthin kommt es jetzt auch!
MfG SideWinder
Windows ist in diesem Fall sehr brav - es lässt keine direkten Interrupt-Aufrüfe zu. Wenn du ein Programm für DOS geschrieben hast, musst du es auch dort testen.
Aber du hast kein Programm für DOS geschrieben -> du dürftest für Win32 kompiliert haben. Dann läuft das Programm nur unter Win32, allerdings sind dort wiederrum die Interrupt-Aufrüfe unerlaubt.
MfG SideWinder
Danke, rapso! Du hattest recht - ich gleiche jetzt im Programm zwischendurch die Zeit aus, die sonst in der Schleife verloren geht.
Das sind immer mal ein paar Tausendstel, die nach und nach zur Sekunde werden!
Gruß, Kotty