myNameIsString
Newbie
- 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:oWorkEventArgs^ 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:rawing::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:rawing::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:rawing::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:rawing::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
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:oWorkEventArgs^ 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:rawing::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:rawing::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:rawing::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:rawing::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