Witam!
Jak obsługiwać główny wątek z drugiego wątku?
Okno jest w wątku głównym.
Jeżeli dodam GetDlgItemTextW do drugiego wątku to ta funkcja nie działa.
Mam taki kod ( nie sugeruj się poprzednimi).
DWORD WINAPI SendExampleEmail(PVOID pvParam)
{
char Buffer28[1000];
char Buffer29[1000];
char Buffer30[1000];
GetDlgItemTextA(hwnd,Z,Buffer28,1000);
GetDlgItemTextA(hwnd,X,Buffer29,1000);
GetDlgItemTextA(hwnd,B1,(LPSTR)Buffer30,1000);
Message message;
message.setSubject("Test");
message.setContents("Test");
message.addAttachment("");
message.addRecipient(Buffer28);
SMTPTransport smtp;
smtp.setHostAddress(Buffer29);
smtp.setPort(587);
smtp.setSenderAddress(Buffer28);
smtp.setSenderPassword(Buffer30);
smtp.send(message);
return 0;
};
i
if(wParam==BUTTON1)
{
DWORD Id;
CreateThread(NULL,0,SendExampleEmail,(LPVOID)0,0,&Id);
break;
}
Mówiłeś ,że funkcja GetDlgItemTextA działa w wątku a mi nie działa. :(
Debugger pokazuje złe wartości tych zmiennych.
Deja Vu?
Pobierz wszystkie dane z kontrolek do obiektu jakiejś struktury. Utwórz nowy wątek (prześlij obiekt z danymi, jako parametr wątku).
No to prościej. Jak pobrać zawatość texboxa z dialogu w wątku?
Gdzie ustawisz wartość zmiennej hwnd? Czy wartości tych wszystko mówiących stałych (to chyba stałe) Z, X i B1 są poprawne?
Zmienną hwnd dodaje w pliku a Z,X,B1 to identyfikaotry texboxów w zasobach.
smtp.setSenderAddress(Buffer28);
skąd wiesz że nie Buffer29? a może to miał być Buffer27? będziesz to za miesiąc pamiętał?
Zapisałem sobie w komentarzu taki exapmle inforumujący gdzie i co ma być.
Zrób następujące zmiany i pokaż co się dopisało do pliku plik.log
char Buffer28[1000]={0};
FILE *log;
unsigned ret;
ret=GetDlgItemTextA(hwnd,Z,Buffer28,1000);
log=fopen("plik.log","a");
fprintf(log,"hwnd=%d; Z=%d; Buffer28=\"%s\"; ret=%u; Error=%d;\n",hwnd,Z,Buffer28,ret,GetLastError());
fclose(log);
hwnd=1049110; Z=233; Buffer28=""; ret=0; Error=0;
Na bezsensowne nie wyglądają, więc dodaj jeszcze:
FILE *log;
log=fopen("plik.log","a");
fprintf(log,"hwnd=%d; Z=%d;\n",hwnd,Z);
fclose(log);
przed:
CreateThread(NULL,0,SendExampleEmail,(LPVOID)0,0,&Id);
Skasuj plik "plik.log"
Odpal.
Pokaż zawartość "plik.log"
hwnd=1377448; Z=233;
Tak w pliku resource.h.
Dodaj jeszcze przed:
CreateThread(NULL,0,SendExampleEmail,(LPVOID)0,0,&Id);
taki kod:
char Buffer28[1000]={0};
unsigned ret;
ret=GetDlgItemTextA(hwnd,Z,Buffer28,1000);
log=fopen("plik.log","a");
fprintf(log,"hwnd=%d; Z=%d; Buffer28=\"%s\"; ret=%u; Error=%d;\n",hwnd,Z,Buffer28,ret,GetLastError());
fclose(log);
Odpal i pokaż wszystkie trzy wiersze które się zapisali do pliku plik.log
hwnd=1508516; Z=233; Buffer28=""; ret=0; Error=0;
hwnd=262636; Z=233;
hwnd=262636; Z=233; Buffer28=""; ret=0; Error=183;
hwnd=262636; Z=233; Buffer28=""; ret=0; Error=183;
No i tu dochodzimy do sedna bez wątku GetDlgItemTextA u ciebie zwraca dokładnie to samo co wewnątrz wątku. Z tym że GetLastError() daje nie odpowiednie dane, trzeba zmienić na:
char Buffer28[1000]={0};
unsigned ret;
int err;
ret=GetDlgItemTextA(hwnd,Z,Buffer28,1000);
err=GetLastError();
log=fopen("plik.log","a");
fprintf(log,"hwnd=%d; Z=%d; Buffer28=\"%s\"; ret=%u; Error=%d;\n",hwnd,Z,Buffer28,ret,err);
fclose(log);
183 to przez fopen - bo plik już istnieje.
_13th_Dragon napisał(a):
No i tu dochodzimy do sedna bez wątku GetDlgItemTextA u ciebie zwraca dokładnie to samo co wewnątrz wątku.
Wobec czego pokaż cały kod łącznie z rc bo raczej nie dojdziemy końca co masz źle.
Kod źródłowy w załączniku.
Nie mam kompilatora ale po mojemu to dodaj sobie globalną zmienną hDlg i:
DialogBox(hInstance,MAKEINTRESOURCE(210),hwnd,DlgProc);
zmień na:
hDlg = DialogBox(hInstance,MAKEINTRESOURCE(210),hwnd,DlgProc);
i wszędzie gdzie próbujesz czytać ten nieszczęsny tekst z tych kontrolek zmień hwnd na hDlg
Kontrolki są przecież na oknie dialogowym i ono jest ich właścicielem a nie główne okno programu.