Pliki i Sockety działają ale... nie zawsze

0

Witam.
od razu napisze że problem dotyczy i Delphi i Buildera.
Mamy TSerwerSocket i TClientSocket. I sobie przesyłamy pliki. Wszystko ładnie działa bez żadnego problemu. Pliki się przesyłają w całości. Ale problem się pojawia w momencie gdy Serwer wysyła klientowi plik a ten go odbiera i w momencie gdy klikniemy na formie w kliencie czy chcemy formę przesunąć na pulpicie to klient się wtedy wywala. Generuje błąd. I teraz jak to zrobić że w momencie gdy klient odbiera pakiety to można by robić jescze inne rzeczy jak przesuwanie formy po pulpicie bądż co kolwiek innego. Dodam że w momencie uruchomienia klienta ma on 4 wątki choć ja mu ich nie tworzyłam. A w momencie gdy klient odbiera plik ma tych wątków aż 6. Pakowałam Application->ProcessMessage do kilkunastu miejsc ale nic nie pomaga.

0

Widzę że nikt za bardzo nic nie wie. To napiszę tak - Czy mógłby ktoś udostępnić program do przesyłania plków który by nie generował błędów podczas transweru i przesuwania formy po pulpicie.

0

Może spróbuj użyć komponentu TidAntiFreeze (czy jakoś tak, taki żółty komponencik) wrzucając go na formę i skompiluj program. Może to coś da?

0

To też nic nie pomogło. A może koncepcja przesyłania wsztstkiego na jednym porcie jest niewłaściwa. Bo gdy przesyłamy w ten sposób to każdy pakiet możemy sobie oznaczyć. Wstawię kawałek kodu i może ktoś coś poradzi.

void __fastcall TForm1::CS1Read(TObject *Sender, TCustomWinSocket *Socket)
{
lenSocket = Socket->ReceiveLength();// tak czy inaczej serwer może najwięcej 1024 bajty przysłąć
::memset(data,0x00,1030); // wyczysc 1030b pamieci
Socket->ReceiveBuf(data,lenSocket); * odczytaj pakiet i zapisz do data * char data[1024]

if ((data[0] == '2') && (data[1] == '0')) {
// serwer przysle najpierw rozmiar pliku
String rozmiar = data;
rozmiar = rozmiar.Delete(1,2); // usuwamy "20" to pozostanie liczba mowiaca o wielkości pliku
ile_odebralemFSize = 0;
Form2->ProgressBar1->Min = 0;// na Formie2 mam umieszczony progres wskazujacy postep pobierania pliku
Form2->ProgressBar1->Max = StrToInt(rozmiar);
Form2->ProgressBar1->Position = 0;
komunikat("1Pobieram plik o rozmiarze: " + rozmiar + " b");// to dodaje do memo
return; //zakoncz funkcje bo tylko ten pakiet chcialam teraz odebrac
}
if ((data[0] == '2') && (data[1] == '1')) {
// teraz mi przysyła kolejne pakiety pliku ktory chcialem pobrac
for(int i = 0; i < lenSocket; i++){
data[i] = data[i+2]; // musimy usunąć znacznik pakietu czyli usuwamy "21"
}
File->Write(data, lenSocket - 2); // zapisuj kolejne porcje pakietow - zapisujemy 1024bajty - 2 bajty jako znacznik pakietu
ile_odebralemFSize += (lenSocket - 2);
Form2->ProgressBar1->Position = ile_odebralemFSize;// pokaż ile juz odebralalem pliku
to właśnie tutaj jest zatrzymywany program. gdy to wezme w komentarz ten progres to program wtedy pracuje dalej ale podczas przesuwania formy po pulpicie zapisuje do pliku zle dane - oryginalny plik rózni się od odebranego. gdy to dam Application->processmessage to jeszcze szybciej sie wywala

	return; //wiecej nic nie rob bo ten pakiet tylko chcialam odebrac

if ((data[0] == '2') && (data[1] == '2')) {
delete File; // przysłał już cały plik to należy zwolnic TFileStream
File = NULL; // i należy go zamknąć
bool_download = false; // wiedzmy że na razie nic już nie pobieram
komunikat("1Odebrałem cały plik");
return;
}

i to jest cała koncepcja mojego programu. Czy może to jednak trzeba zacząć programować na trochę niższym poziomie i używać socketow zamiast komponentow czy może trzeba to przerobić aby odbior pliku był w dodatkowym drugim porcie.
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1