Mam problem tego typu że forma zawiesza się po odebraniu pliku. Forma "wysyłająca" plik po skończeniu wysyłania pracuje poprawnie (to jest ta sama forma - dwukrotnie otworzony ten sam plik). Forma ktora sie zawiesza jest otwierana z formy "matczynej", ktora pierwsza nawiazuje polaczenie.
Tutaj jest kod background workera w formie:
System::Void bwFConnection_DoWork(System::Object^ sender, System::ComponentModel::DoWorkEventArgs^ e)
{
String^ name;
myFConn->Start(); //myFConn - obiekt służący do komunikacji
while (!this->bwFConnection->CancellationPending)
{
name = myFConn->Listen(); //zwracana nazwa pliku ktory ma byc zaraz pobrany
this->Visible = true;
//"czy pobierac plik?"
if ( MessageBox::Show( this,
L"Would you like to receive file " + name + L"??",L"File receiving",MessageBoxButtons::YesNo) == System::Windows::Forms::DialogResult::Yes)
{
lab->Text = L"I'm receiving " + name;
myFConn->Receive(false); //pobieranie
}
else
{
myFConn->Receive(true); //przerwij pobieranie
}
}
}
Gdzie:
- tak wygląda funkcja Start():
void CommFile::Start()
{
while(!whetherConnected); //czekamy az polacza sie formy "matrzyne"
if (ifS)
{
listener = gcnew TcpListener(IPAddress::Any, start_port+1);
listener->Start();
while (!listener->Pending());
client = listener->AcceptTcpClient();
stream = client->GetStream();
w = gcnew BinaryWriter(stream);
r = gcnew BinaryReader(stream);
}
else
{
client = gcnew TcpClient();
client->Connect(alienIP,start_port+1);
stream = client->GetStream();
w = gcnew BinaryWriter(stream);
r = gcnew BinaryReader(stream);
}
}
- tak wygląda funkcja Listen():
String^ CommFile::Listen()
{
while(1)
{
String^ string = r->ReadString(); //wczytanie wiadomosci
if (string == commFileOK) //to dotyczy tylko formy ktora wysyla plik (gdy czeka na odpowiedz)
{
whetherSend = 1;
continue;
}
if (string == commFileCancel)
{
whetherSend = 2;
continue;
}
SetFile(string); //nastawianie zmiennej wewnatrz obiektu
return string;
}
}
- tak wygląda funkcja Receive():
void CommFile::Receive(bool b) //b: true - cancel receiving, false - receive
{
if (b) //czy odebrac czytez nie
{
w->Write(commFileCancel); //wysylanie przerwania
return;
}
w->Write(commFileOK); //wyslanie potwierdzenia
int x = r->ReadInt32(); //odbior rozmiaru
FileStream^ f = gcnew FileStream(GetFile(),System::IO::FileMode::Create);
BinaryWriter^ fw = gcnew BinaryWriter(f);
unsigned char data;
try
{
while (x--) //odbieranie
{
data = r->ReadByte();
fw->Write(data);
}
}
// ... tutaj wszystkie możliwe catch'e
finally
{
fw->Close();
f->Close();
}
}
- tak wreszcie funkcja Send(): (jest ona wywolywana po nacisnieciu buttona w jednej z otwartych form)
bool CommFile::Send()
{
if (!File::Exists(GetFile())) return false;
w->Write(GetFile()->Substring(GetFile()->LastIndexOf('\\')+1)); //wysylam nazwe pliku
whetherSend = 0;
while (!whetherSend); //czekam na odpowiedz
if (whetherSend == 2) return false;
FileInfo^ fi = gcnew FileInfo(GetFile());
int x = int(fi->Length);
w->Write(x); //wysylam rozmiar pliku
FileStream^ f = gcnew FileStream(GetFile(),System::IO::FileMode::Open);
BinaryReader^ fr = gcnew BinaryReader(f);
unsigned char data;
try
{
while (x--) //wysylanie pliku
{
data = fr->ReadByte();
w->Write(data);
}
}
// ... catch'e zwracajace false
finally
{
fr->Close();
f->Close();
}
return true;
}
Probowalem juz wszystkiego, mimo to forma i tak sie zawiesza... mysle ze to tak jakby zawiesil sie background worker ktory w petli while dochodzi powtornie do linijki "name = myFConn->Listen();". Ale tak naprawde to nie mam juz pojecia czemu mi sie ta forma zawiesza... help [???]