Форум: "WinAPI";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];
ВнизПомогите, ПЛЗ! Есть одна ошибка, верне мой баг! Найти похожие ветки
← →
ProtoSoft (2002-11-27 00:00) [0]Привет всем мастерам! Ребят, поможите мне. Есть такая трабла.
Например: В проге я выполняю одну операцию в потоке, для него создается окно статуса. Затем я дальше работаю с прогой, пока выполнятся этот поток. Все идет хорошо, но до тех пор, пока не завершит свою работу этот поток. Т.к. окно, из которого я вызываю поток и соответственно окно статуса давно уже закрылся. Подскажите, как мне решить эту задачу. Может быть это окно статуса открывать при старте проги и скрывать его, и только когда наде на закрывать его, а делать ему hide. Заранее благодарен!
P.S. Мыльте на мыло, если чего.
← →
Digitman (2002-11-27 14:30) [1]
> Т.к. окно, из которого я вызываю поток
Нонсенс. Как это - окно, из которого вызывается код.поток ?
Из окна нельзя вызвать код.поток.
Можно в некоем код.потоке вызвать API-ф-цию, которая стартует новый доп.код.поток.
← →
k (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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c