Przesyłanie tekstu (char*) z wątku do okna

0

mam wątek w programie (zrobiony do nasłuchu socketów), chciałbym po odebraniu tekstu przekazać go do reszty programu.

wątek:

DWORD WINAPI RecvThread(void* P)
{
...
//jakiś zadeklarowany bufor:
char buff[2048];
int datasize;
//odbieram jakiś z gniazda i chciałbym go przekazać do reszty programu:
char *temp = new char[datasize+1];
temp[datasize]=0;
memcpy(temp,buff,datasize);
PostMessage(Form1->Handle,WM_USER+1,datasize,(int)buff);
...
}

celowo nie zwalniam pamięci przydzielonej dla temp, bo chciałbym ją zwolnić w reszcie programu a tekst ten przekazać.

w programie głównym mam tak:

switch (Msg.message)
{
  ...
  case WM_USER+1:
   {
     int size = Msg.lParam;
     char* tekst = (char*)Msg.wParam;
     //tutaj cos robie z tekstem i pozniej go wyswietlam
     delete [size] tekst;
     break;
   }

...
}

po wyswietleniu tekstu okazuje sie ze... no wlasnie... tekst zniknal... przepadl... nima... [???]

czy mógłby mi ktoś wytłumaczyć dlaczego tekst znika (dlaczego ta metoda jest niepoprawna?) oraz jak to poprawnie ten tekst przekazac?

z góry dziękuje za pomoc :)

pozdrawiam

0

nie wiem czy zadziała, ale spróbuj volatile

0

A może trochę jaśnie co znaczy, że zniknął nie ma?
a. komunikat nie dochodzi. Zakładam, że tak bo piszesz, że coś się wyświetla.
b. Msg.wParam ma wartość 0 (NULL).
c. Msg.wParam wskazuje na miejsce, które nie zawiera odebranych danych tylko jakieś śmieci.
d. delete powoduje crush programu (pewnie nie to).
e. jeszcze inny powód.

Poza tym czy to debuggowałeś? Może, w którymś miejscu zrobiłeś jakiś głupi błąd (czasami jedna literówka, której się nie widzi, powoduje różne dziwne rzeczy).
Ten fragment kodu wygląda Ok.

@winerfresh: volatile nie ma tu nic do rzeczy. Poza tym na czym niby miał by je zastosować, na której zmiennej? W końcu on przekazuje własność obszaru pamięci poprzez komunikat, nie ma tu współdzielonych zmiennych.

0

wygląda to tak jakby pamięć się sama zwolniła.

DWORD WINAPI Thread(void* P)
{
  char buff[2048] = "ala ma kota";
  int datasize = strlen(buff);
  char *temp = new char[datasize+1];
  temp[datasize]=0;
  memcpy(temp,buff,datasize);
  PostMessage(Form1->Handle,WM_USER,datasize,(int)buff);
  return 0;
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
  DWORD dwThreadId;
  HANDLE uchwyt = CreateThread(NULL,0,Thread,NULL,0,&dwThreadId);
  if (uchwyt==NULL)
    ShowMessage("Nie udalo sie stworzyc watku!");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
  if (Msg.message==WM_USER)
   {
    int size = Msg.lParam;
    char* tekst = (char*)Msg.wParam;
    ShowMessage(AnsiString(tekst));
    delete [size] tekst;
   }
}

AV dostaje...

EDIT:
ech... mam skurczybyka:

PostMessage(Form1->Handle,WM_USER,datasize,(int)buff);

powinno być:

PostMessage(Form1->Handle,WM_USER,datasize,(int)temp);

dziala juz :P
zaczelem obserwowac wskazniki i zobaczylem ze inny wysylam i inny odbieram.. :P po prostu na poczatku wyswietlalem wskaznik temp-a a potem buff-a i to samo wysyłałem.... ;P

pozdrawiam
i dzięki za naprowadzenie :)

EDIT2:
i drugi błąd jeszcze był, zwalniałem więcej pamięci niż przydzieliłem co powodowało AV.

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