Главная страница
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.022 c
15-1192119312
3Lander
2007-10-11 20:15
2007.11.18
как защитить фаил баз данных


2-1193379623
Layner
2007-10-26 10:20
2007.11.18
Узнать, над каким элементом вызвали PopupMenu


15-1192118907
Kolan
2007-10-11 20:08
2007.11.18
Еще раз вопрос про BugTracking, старая ветка пропала&#133


2-1193218088
nAlex
2007-10-24 13:28
2007.11.18
Canvas.Draw, Bitmap, ImageList


6-1173969872
Fantasy
2007-03-15 17:44
2007.11.18
NETAPI32.DLL