blockierende funktion schreiben
-
Hi,
ich arbeite zur zeit an einem chat programm.
Ich arbeite mit einer selbst geschriebenen buffer klasse, die auch funzt, aber um die einkommenden daten zu verarbeiten benutze ich einen thread, der die ganze zeit aus dem buffer ließt und wenn was drinsteht es verarbeitet, was zu leistungs problemen kommt(die eingabe laggt sogar). Meine Idee, ich mache aus der read() funktion meiner buffer klasse eine blockierende funktion, also sowas wie die recv() bei den tcp sockets, also dass die funktion den thread solange schlafen lässt bis etwas im buffer steht und nicht die ganze zeit in ner while schleife fragt.Frage: Wie kann ich die funktion schlafen lassen bis etwas im buffer steht?
Mfg Yazoo
-
Schau dir mal Sleep () an.
http://msdn.microsoft.com/en-us/library/ms686298(VS.85).aspx
-
zugegeben, ich hab nicht so viel ahnung von sockets und tjreads, aber schau mal nach select() - ich meine das ist was in der Art wie du es suchst.
-
Yazoo schrieb:
Frage: Wie kann ich die funktion schlafen lassen bis etwas im buffer steht?
Würde es nicht gehen, wenn du die Funktion erst aufrufst, wenn etwas im Buffer steht?
-
Sleep() und select() kenne und benutze ich, aber Sleep() hilft mir nicht, da ich ja nicht weiß oder errechnen kann, wann etwas im buffer steht. select() benutze ich auch, ich mache das so, das ich mit select auf ne nachricht warte, dann die Nachricht in den buffer schreibe (der global is) und in nem anderen thread die Nachricht aus dem buffer hole und dann verarbeite, also gucke ob da bestimmte Befehle drin sind. ich hole die Nachricht aus dem buffer mit der funktion read()
das mache ich in ner while schleife und das verbraucht jede menge cpu, deshalb wollte ich die funktion blockierend machen.
-
Nexus schrieb:
Yazoo schrieb:
Frage: Wie kann ich die funktion schlafen lassen bis etwas im buffer steht?
Würde es nicht gehen, wenn du die Funktion erst aufrufst, wenn etwas im Buffer steht?
aber wie soll ich rauskriegen ob was im buffer is oder nicht, ohne eine funktion auf zu rufen?
-
hier mal meine buffer klasse:
buffer.h:
#ifndef BUFFER #define BUFFER #define BUFFER_FULL -1 #define BUFFER_EMPTY ° #include <string> using namespace std; class buffer { public: buffer(); ~buffer(); void write(string); string read(); int GetLength() const; private: int getlatestfree() const; void delall(); void del(); string Buf[100]; int Length; }; #endifbuffer.cpp:
#include "buffer.h" #include <iostream> #include <string> using namespace std; buffer::buffer() { delall(); } buffer::~buffer() {} void buffer::write(string text) { int i = getlatestfree(); if(i != BUFFER_FULL) { Buf[i] = ""; Buf[i] = text; Length += 1; } else { std::cout << "BUFFER-FEHLER: Der Buffer ist foll! Versuchen sie es spaeter erneut!\n"; } } string buffer::read() { string buf; if(Buf[99] != "") { buf = ""; buf = Buf[99]; del(); return buf; } else { return "°"; } } void buffer::del() { for(int i = 99; i > (99 - Length); i--) { if(i != 0) { Buf[i] = ""; Buf[i] = Buf[i-1]; } else { Buf[0] = ""; } } Length -= 1; } int buffer::getlatestfree() const { int i; for(i = 99; i >= 0; i--) { if(Buf[i] == "") { return i; } } return BUFFER_FULL; } void buffer::delall() { for(int i = 0; i < 100; i++) { Buf[i] = ""; } Length = 0; } int buffer::GetLength() const { return Length; }
-
Schau mal hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-169346-and-highlight-is-thread.html
Gruß Tobi.