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 [???]