Borland C++ Builder - sockety - asynchroniczny odbiór

0

Witam

Co chcę wykonać:
Aplikacja okienkowa (środowisko Borland C++ Builder 6), która będzie asynchronicznie odbierała wiadomości z serwera poprzez sockety.

Co mam zrobione:
Połączenie z serwerem.

Z czym mam problem:
Problem mam z asynchronicznym odbiorem wiadomości, które wysyła serwer.
Plan mam taki:

  • aplikacja ma dwie "formy"
  • pierwsza forma (główna) łączy z serwerem (to działa ok) i wywołuje asynchroniczne odbieranie wiadomości
  • uchwytem do odbioru tych wiadomości jest forma druga
    Nie mogę sobie tylko poradzić z odczytem wiadomości wysyłanej do tego drugiego okienka.

Oto kod:

Forma główna - unit1

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{

    HWND okno = Form2; // uchwyt do drugiego okna ktore ma odbierac wiadomosci

    // kod laczenia z serwerem
    // pomijam go bo tu wszystko działa poprawnie

    // po wywołaniu connect() następuje
    WSAAsyncSelect(ConnectSocket,okno,WM_USER,FD_CONNECT|FD_READ|FD_WRITE|FD_ACCEPT);

}

Forma druga, odbierająca wiadomości - unit2 (uchwyt okno)

// funkcja wirtualna łapiąca wiadomości
void __fastcall TForm2::WndProc(TMessage &Message)
{

	switch(Message.Msg)
	{
		case WM_USER:
			Form2->Label1->Caption="zlapana";
		break;
	}

	TForm::WndProc(Message);

}

// konstruktor
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{

    Form2->Label1->Caption="start";

    // właściwie tutaj nie wiem czy coś trzeba dawać
    // próbowałem poniższe konstrukcje lecz bezskutecznie :/

    //MSG Msg;

    //GetMessage(&Msg, this, WM_USER, WM_USER+4);

    //TranslateMessage(&Msg);
    //DispatchMessage(&Msg);

}

Byłbym wdzięczny za jakąkolwiek pomoc, która by mnie naprowadziła na poprawne rozwiązanie.
Niestety na podstawie przykładów z internetu nie mogę skutecznie rozwiązać tego problemu :/

0

HWND okno = Form2; // ????

HWND okno = Form2 -> Handle ;
0

Ok poprawiłem ten głupi błąd.

Cały kod konstruktora Form1 przerzuciłem do Onclicka stworzonego buttona, tak aby przy przypisywaniu uchwytu Form2 już istniał.

Teraz sytuacja jest taka:

Jak normalnie uruchamiam program to po kliknięciu buttona zawieszają się obie formy.

Przy debbugowaniu linia po lini:

  1. wywoływany jest konstruktor Form1
  2. wywoływany jest konstruktor Form2, ale nie wywołuje kodu znajdującego się w nim tylko przechodzi do punktu 3.
  3. kilkanaście lub nawet kilkadziesiąt razy wywoływana jest funkcja Form2::WndCmd - ani razu nie jest spełniony case WM_USER
  4. pojawiają się okna (na przemiennie z wywoływaniem WndCmd)
  5. klikam przycisk z Form1
  6. łączy się z serwerem
  7. wysyła "powitalną" wiadomość
  8. wywołuje: WSAAsyncSelect()
  9. przechodzi do WndCmd i tym razem spełniany jest case WM_USER
  10. teraz nie ma już kontroli nad formami

Czyli generalnie cel odebrania wiadomości wysłanej do okna 2 jest zrealizowany tyle, że nie wiem skąd to zwieszenie programu :/

0

Może socket działa Async ale obsługa komunikatu działa synchronicznie , w wątku głównym , jeśli nie obsługujesz go prawidłowo to zablokujesz
całą aplikację.
Pewnie jakieś szczegóły z WndProc , nie miałem do czynienia z gniazdami , zapytaj Barona :
http://programowanie.cal.pl/forum/index.php

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