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

Вниз

Помогите, ПЛЗ! Есть одна ошибка, верне мой баг!   Найти похожие ветки 

 
ProtoSoft   (2002-11-27 00:00) [0]

Привет всем мастерам! Ребят, поможите мне. Есть такая трабла.
Например: В проге я выполняю одну операцию в потоке, для него создается окно статуса. Затем я дальше работаю с прогой, пока выполнятся этот поток. Все идет хорошо, но до тех пор, пока не завершит свою работу этот поток. Т.к. окно, из которого я вызываю поток и соответственно окно статуса давно уже закрылся. Подскажите, как мне решить эту задачу. Может быть это окно статуса открывать при старте проги и скрывать его, и только когда наде на закрывать его, а делать ему hide. Заранее благодарен!
P.S. Мыльте на мыло, если чего.


 
Digitman ©   (2002-11-27 14:30) [1]


> Т.к. окно, из которого я вызываю поток


Нонсенс. Как это - окно, из которого вызывается код.поток ?
Из окна нельзя вызвать код.поток.
Можно в некоем код.потоке вызвать API-ф-цию, которая стартует новый доп.код.поток.


 
©   (2002-11-27 19:11) [2]

я бы сделал так
пусть окно создается(или показывается) перед созданием и запуском потока.
т.е. все операции с окном статуса делаем в основном потоке

о своем статусе функция потока будет сообщать посредством сообщений. т.е. сделал 1000 (или 1000000) циклов - послал мессагу WM_USER + 1, его обрботчик подвинул бар на 1 шаг...

перед end функции потока пошли сообщение об окончании потока напр WM_USER + 2. и в обработчике этого сообщения убить/спрятать окно статуса.

изврат, наверное, но как я понял сообщения - стандартный спасоб обмена событиями между нитями


 
ProtoSoft ©   (2002-11-27 19:14) [3]

Digitman
Може я че не так написал, ну короче ситуация, я немного разобрался но тогда ситуация была такая, допустим form1 это основное окно проги, из form2 я вызываю поток THRead, который открывает окно form3 для отображения своей работы, пока этот поток работает, я закрываю form2 и работаю с form1. Все быфло ОК, пока не заканчивается выполняться этот поток THRead. Я зделал так, как я там и писал, запускал form3 и делал ему hide.
А потом в потоке show и в конце hide. Все получилось хорошо, но может быть что еще подскажут мастера.
Но теперь есть другая трабла, с тем же THRead другого потока.
Функция, которую я запускаю в отдельном потоке сканирует каталоги на диске, собирает инфо о файлах и т.д., если я ее в процедуре execute запускаю свою функция с помощью
...
procedure TScanDir.Execute;
begin
Synchronize(DoScanProc);
end;

procedure TScanDir.DoScanProc;
begin
ScanDirThRead; //Моя функция
end;

Все работает хорошо абсолютно, вот только мое окно "мертвое", пока не закончится выполняться поток.

А если я убираю Synchronize() и втыкаю без него, все работает ОК, окно "живое", но все ОК пока не закончится процедура ScanDirThRead, затем возникает ошибка, что-то там OS critical error или что-то вроде этого.
Поможите плз, с меня пиво!


 
Cobalt ©   (2002-11-27 21:44) [4]

Формы и потоки - 2 вещи несовместные (в Дельфи) ;((


 
ProtoSoft ©   (2002-11-27 22:58) [5]

//Cobalt
//Формы и потоки - 2 вещи несовместные (в Дельфи) ;((


Не понял? Что ты имел в виду про совместимость. Поток работает сам по себе, а форма лишь является индикатором процесса в моем случае


 
Digitman ©   (2002-11-28 08:57) [6]


> из form2 я вызываю поток THRead


Да не из form2 ты "вызываешь поток" !

Конструктор объекта класса THRead ты вызываешь из некоей подпрограммы ! Которая, очевидно, у тебя является одним из функциональных (или процедурных) методов объекта класса TForm2 !
Любая же п/программа (будь она просто - сама по себе - процедура или функция, или же это - метод объекта), будучи вызванной в какой-то момент времени при каких-то условиях, выполняется в конкретном кодовом потоке.
Ты кликнул кнопку на форме form2 ? И у кнопки есть процедура-обработчик Button1Click() ? И в тексте обработчика вызывается конструктор THRead.Create(..) ? Если так, то все, что написано в теле метода form2.Button1Click(), в дан.случае выполнится в осн.потоке текущего процесса. Т.е. здесь код конструктора THRead.Create(..), исполняющийся в осн.код.потоке (а не в форме !), заставляет ОС создать и стартовать доп.код.поток.

Все события окон, созданных в осн.код.потоке (а конструкторы оконных форм form1, form2 и form3 будут вызваны ИМЕННО в осн.потоке !) будут возбуждаться последовательно - одно за другим - основным код.потоком и им же обрабатываться.
Доп.код.поток TScanDir в теле метода Execute обращается к методу Syncronize(). Тем самым доп.код.поток "встает в очередь" к осн.код.потоку на обработку им события CM_EXECPROC, в которой от осн.код.потока требуется выполнить метод TScanDir.DoScanProc. Пока осн.код.поток выполняет обработку CM_EXECPROC (т.е. исполняет метод TScanDir.DoScanProc), все остальные события всех окон осн.код.потока "ждут" своей очереди на обработку. Среди этих "ждущих" событий есть и события, связанные с кликами кнопок, "перетаскивания" форм и пр. и пр. А поскольку все эти события польз.интерфейса стоят в очереди на обработку (осн.поток же занят исполнением TScanDir.DoScanProc !!), как раз и наблюдается эффект "мертвых окон".


 
ProtoSoft ©   (2002-11-28 23:38) [7]

Да спасибо мастерам! Немного поэксперемнтировал и наткнулся на application.processmessage; Помогает, ну пока работает ОК, использую synchronize и processmessage. Но я хочу еще спросить. Где-то прочитал, вроде на этом сайте в статьях есть статейка про THread так вот, они пишут, что все передаваемые ей значения должны быть описаны в заголовке THRead и только таким способом, а все остальное считают траблой. Може мне кто-нить объяснит, че за фак, вроде отдельный поток работает без проблем с глобальными переменными?


 
Digitman ©   (2002-11-29 08:33) [8]


> в заголовке THRead


Что это за "заголовок" еще такой ?
Если ты о декларации класса, то так и говори.


> и только таким способом


> отдельный поток работает без проблем с глобальными переменными


Чушь полная.


 
Fantasist ©   (2002-11-29 19:33) [9]


> > отдельный поток работает без проблем с глобальными переменными
>
>
> Чушь полная.


Почему чушь? Работает без проблем. :) Проблемы возникают, если этой глобальной переменной пользуется еще кто-то, кроме этого потока.



Страницы: 1 вся ветка

Текущий архив: 2003.01.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
14-49292
Cr@sh
2002-12-27 13:15
2003.01.16
Пищит монитор...


1-49146
БурЖуй
2003-01-05 14:30
2003.01.16
Tthread, как и почему?


3-48843
Рыжик
2002-12-15 14:02
2003.01.16
Локальные временные таблицы (MSSQL) + ADO


4-49340
Cosmic
2002-11-27 22:33
2003.01.16
Как проиграть MP3 средствами API ???


1-48982
mate
2003-01-06 15:02
2003.01.16
Word и Delphi