C++ Windows Forms Anwendung Backgroundworker

Registriert
Juni 2015
Beiträge
3
hallo vlt kann mir ja hier jemand helfen und zwar programmiere ich das spiel schiffe versenken in c++ in visual studio 2010 mit einer grafischen oberfläche die anwendung hat einen client und einen server da das ganze übers netzwerk(winsocket) spielbar sein soll.

So da kommt auch mein problem ins spiel ich hab noch nie was mit dem Background worker gemacht, ich weiß lediglich dass er dafür da ist ein ablauf parralel zu verarbeiten und der will einfach nicht so wie ich will .

Ich hab da eine while schleife im bg(backgroundworker) die immer auf eine nachricht vom gegner wartet und dann die schleife verlassen soll und eine antwort zurück schicken soll doch an dem punkt nachdem er die schleife verlassen hat (die nachricht erhalten hat) ignoriert er denn code der danach kommt vollkommen ,dass hab ich durch debuggen mit status nachrichten ermittelt da . Ich markier mal wo er dann aufhört


private: System::Void backgroundWorker1_DoWork(System::Object^ sender, System::ComponentModel::DoWorkEventArgs^ e)
{
bool as = true;
#pragma region server
// server laufen lassen
if(isServer)
{
while(true)
{
//den server laufen lassen
meinServer->ausfuehren();
//status ausgeben

neuerText = ConvertToString( meinServer->getInfotext() );
this->richTextBox1->Text += neuerText;
}
}
#pragma endregion server


else // client anfang ; if1= server ;else1 = client ; der methode
{




if( (amzug && aAW) && (sieg == 0) ) // wenn ich dran bin und auf eine antwort warte und das spiel noch läuft
{


as = true; // as auf true um schleife einzuleiten
while(as) // solange warten bis nachricht empfangen wurde wenn as = false ist nachricht erhalten
{

//den Clienten nachrichten empfangen lassen
while(meinClient->empfangen())
{

neuerText = ConvertToString( meinClient->getInfotext() );
this->richTextBox1->Text += neuerText;
this->richTextBox1->Text += ConvertToString( meinClient->getNachricht() ); //
as = false; // bestätigen das nachricht empfangen wurde verlasse schleife
HIer kommt er an , durch as = false sollte er die schleife verlassen und die nachricht verarbeiten nachdem er die nachricht hat hört er aber auf und macht nix mehr

}


}
// nachricht weiter verabeiten wenn 1 = schiff getroffen wenn 0 = schiff nicht getroffen 1 = versenken zu 2 ; 0 = versucht 1

wenn ich hier einen debug nachricht einbau um zu schauen ob er die nachricht verarbeitet taucht sie nicht auf und ne antwort schickt er auch nicht somit schlussfolgere ich dass er hier nie ankommt obwohl er die nachricht er halten hat und as = false ist da die debug nachricht (siehe oben) auftaucht

char dieNachr[100];
memset(dieNachr, 0, sizeof(dieNachr));
int a = System::Convert::ToInt32(alal);
if(a == 1) // wenn a == 1 hab ich getroffen
{

isSpieler->abschiesen(xx,yy,true); // überprüfen ob
this->spielfeld[xx,yy]->BackColor = System::Drawing::Color::Red;
amzug = true; // bin immernoch dran
aAW = false;
if(isSpieler->Sieg() == 2)
{
sieg = 2; // gewonnen gegner hat keine schiffe mehr
MessageBox::Show("sieg","debug");
}
}
else
{
isSpieler->abschiesen(xx,yy,false);
this->spielfeld[xx,yy]->BackColor = System::Drawing::Color::Blue;
amzug = false; // jetzt bin ich nicht mehr dran
aAW = true; // warte auf antwort des gegners
}


neuerText = ConvertToString( meinClient->getInfotext() );
this->richTextBox1->Text += neuerText;


} // wenn ich der spieler dran bin ende






else if((!amzug && aAW)&& sieg == 0) // wenn ich nicht dran bin und auf eine anfrage des gegners warte und das spiel noch läuft
{

bool immer = true;
while(immer)
{
as = true; // as auf true um schleife einzuleiten
while(as) // solange wiederholen bis eine nachricht da ist
{

//den Clienten nachrichten empfangen lassen
while(meinClient->empfangen())
{
neuerText = ConvertToString( meinClient->getInfotext() );
this->richTextBox1->Text += neuerText;
this->richTextBox1->Text += ConvertToString( meinClient->getNachricht() );
alal = ConvertToString( meinClient->getNachricht() );
as = false; // antwort erhalten

}

//




} // auf antwort warten ende

char dieNachr[100];
memset(dieNachr, 0, sizeof(dieNachr));
int b = 0,c = 0;
int a = System::Convert::ToInt32(alal);
b = a/10;
c = a%10; //string vom anderen spieler bsp:"25" zeile 2 spalte 5; 25/10 = 2 = b ; 25%10 = 5 = c;
this->richTextBox1->Text += "nachricht erhalten verarbeitet";
if(isSpieler->beschuss(b,c)) // wurde ich getroffen? wenn ja antwort an gegner schicken getroffen und feld zu versenkt ändern
{
alal = "1";
ConvertToC(dieNachr, alal);
meinClient->versenden( dieNachr );

neuerText = ConvertToString( meinClient->getInfotext() );
this->richTextBox1->Text += neuerText;
this->spielfeld2[b,c]->BackColor = System::Drawing::Color::Red; // versenktes schiff
amzug = false; //immernoch nicht dran
aAW = true; // warte wieder auf eine antwort
this->richTextBox1->Text += "nachricht versendet ich bin nicht dran";
if(isSpieler->Sieg() == 1)
{
sieg = 2; // verloren
MessageBox::Show("verloren","debug");
}
}
else // wurde ich getroffen wenn nein antwort an gegner schicken und feld zu versucht ändern
{
alal = "0"; // String^
ConvertToC(dieNachr, alal);
meinClient->versenden( dieNachr );

neuerText = ConvertToString( meinClient->getInfotext() );
this->richTextBox1->Text += neuerText;
this->spielfeld2[b,c]->BackColor = System::Drawing::Color::Blue; // versuchtes feld vom gegner
amzug = true; // jetzt bin ich dran
aAW = false; // warte nicht mehr auf eine antwort
immer = false;
this->richTextBox1->Text += "nachricht versendet ich bin dran";
}

}











} // wenn ich nicht dran bin und auf anfrage warte ende

} // client ende
} // worker ende
 
Das ist eh kein C++, zumindest nicht "pures" C++. Sieht eher nach diesem Managed C++ Bockmist von Microsoft aus.
 
Ich kenne mich nicht mit C++ aus aber evtl. liefert meinClient->empfangen() immer etwas, das als true erkannt wird?
hat viel gehelft danke ;D hab mir erstmal ins gesicht hauen müssen weil es so banal war

aber meine nudel suppe die ich code nenne hängt nun das programm auf und spuckt keine fehler oder ähnliches verwertbares aus

gibt es irgentwie eine möglichkeit so einen fehler zu finden ? wenn er nirgents aufgelistet wird?

ich weiß wo das programm sich aufhängt aber nicht wiso die suppe hier ist im grunde für zwei sachen gut je nachdem ob es als server oder client gestartet wird ...

wenn der backgroundworker als server gestartet wird und die schleife verlässt passiert nichts (ja ich weiß das kann er garnicht // nur wenn ich es umschreibe dass er die schleife verlassen soll um es zu testen ) mit nichts mein ich er macht das was er machen soll wenn er am ende des bg an kommt(also nichts) und beendet denn bg ganz normal


wenn ich jetzt aber denn teil durchlaufen lasse im bg der für denn client gedacht ist hängt sich das programm auf sobalt der bg fertig ist aus mir unersichtlichen gründen ohne einen fehler auszu spucken "programm funktioniert nicht mehr"
 
myNameIsString schrieb:
ich weiß wo das programm sich aufhängt aber nicht wiso
Dann geht dort mit dem Debugger durch. Der .net Backgroundworker feuert ein Event RunWorkerCompleted, wenn er durch ist. Wenn deiner das auch macht, schau' mal dort rein.
 
Zurück
Oben