Winapi-Problem z wątkami

0

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.

0

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. :(

0

Debugger pokazuje złe wartości tych zmiennych.

1

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).

0

No to prościej. Jak pobrać zawatość texboxa z dialogu w wątku?

0

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?

0

Zmienną hwnd dodaje w pliku a Z,X,B1 to identyfikaotry texboxów w zasobach.

0

smtp.setSenderAddress(Buffer28);

skąd wiesz że nie Buffer29? a może to miał być Buffer27? będziesz to za miesiąc pamiętał?

0

Zapisałem sobie w komentarzu taki exapmle inforumujący gdzie i co ma być.

0

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);
0

hwnd=1049110; Z=233; Buffer28=""; ret=0; Error=0;

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"

0

hwnd=1377448; Z=233;

0

Tak w pliku resource.h.

0

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

0

hwnd=1508516; Z=233; Buffer28=""; ret=0; Error=0;

0

hwnd=262636; Z=233;
hwnd=262636; Z=233; Buffer28=""; ret=0; Error=183;
hwnd=262636; Z=233; Buffer28=""; ret=0; Error=183;

0

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.

0
_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.

0

Kod źródłowy w załączniku.

0

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.

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