Форум: "Начинающим";
Текущий архив: 2007.11.18;
Скачать: [xml.tar.bz2];
ВнизНедопустимый дескриптор окна Найти похожие ветки
← →
Alex_C (2007-10-22 10:48) [0]Возникает следующая проблема: полачаю данные из инета в отдельном треде. При получении данных делаю следующее:
// Процедура вызываемая при получении очередной порции данных
// для изменения кол-ва скачанных данных
procedure DLProc( RcvByte: Integer );
begin
MainForm.WaitPanel.Caption := "Download: " + IntToStr(RcvByte) + " bytes";
MainForm.WaitPanel.Refresh;
end;
// Собственно сама нить:
procedure TGetThread.Execute;
begin
FreeOnTerminate := True;
try
EnterCriticalSection( CS );
MainForm.DownloadButton.Enabled := False;
GetsData := TStringList.Create;
MainForm.WaitPanel.Visible := True;
MainForm.WaitPanel.Refresh;
GetsData.Text := HTTPGet( GetStr, "GET", "", DLProc );
GetsData.SaveToFile("C:\ReceiveData.txt" );
finally
MainForm.WaitPanel.Visible := False;
GetsData.Free;
MainForm.DownloadButton.Enabled := True;
LeaveCriticalSection( CS );
end;
end;
Так вот, при выходе из проги, если б хотя бы раз вызывалась эта нить, возникает ошибка:
Exception EOSError:
System Error: Code 1400
Недопустимый дескриптор окна.
Если нить не запускать, прога естественно нормально завершается. Все качает и отображаетка как надо.
Вопрос: почему так происходит?
← →
Сергей М. © (2007-10-22 10:50) [1]
> почему так происходит?
Потому что обращение к визуальным VCL-контрола в доп.потоке недопустимо.
← →
Alex_C (2007-10-22 10:54) [2]Да все понял. Всему виной строки
MainForm.WaitPanel.Visible := True;
и
MainForm.WaitPanel.Visible := False;
А как же мне сделать, чтоб верно было?
← →
Сергей М. © (2007-10-22 10:58) [3]
> Alex_C (22.10.07 10:54) [2]
воспользоваться методом TThread.Synchronize()
← →
Рамиль © (2007-10-22 10:58) [4]
> Alex_C (22.10.07 10:54) [2]
А комментарии при создании модуля потока смотрели? Там не просто так написано..
← →
Alex_C (2007-10-22 11:03) [5]Ок! Все разобрался! Всем спасибо!
← →
Alex_C (2007-10-22 11:18) [6]Теперь появилась следующия проблема:
если окно программы не трогать - все работает без проблем, а вот если попытаться его передвигать - то само окно не перерисовавыется, счетчик скачанных байт перестает изменяться и программа зависает.
Как вот такое поведение программы побороть?
← →
Сергей М. © (2007-10-22 11:22) [7]
> программа зависает
Что сие значит ?
← →
Alex_C (2007-10-22 15:39) [8]В общем я не правильно выразился :)
Если форму окна не трогать - все работает и циферки скачанный байт бегут. Если переместить форму по экрану, то она перестает перерисовываться - т.е. циферки застывают в том положении, в котором я начал перемещать форму и по краям пормы появляется белое поле, хотя скачивание происходит и дальше и затем, когда все скачивается (завершается работа нити), форма становится нормального вида.
← →
Сергей М. © (2007-10-22 15:52) [9]Показывай код
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.11.18;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.046 c