Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.18;
Скачать: CL | DM;

Вниз

Недопустимый дескриптор окна   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
15-1192694476
Ekzot
2007-10-18 12:01
2007.11.18
Универсальный клиент к БД.


15-1192360079
Актер
2007-10-14 15:07
2007.11.18
Спектакль


15-1192712579
фыва
2007-10-18 17:02
2007.11.18
FastReport


2-1193114182
AleKo
2007-10-23 08:36
2007.11.18
Перечисляемый тип.


2-1193504034
Steep
2007-10-27 20:53
2007.11.18
Поиск папок