Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.009 c
4-49338
alvin
2002-11-27 09:16
2003.01.16
Реестр в WinAPI


3-48879
Rus
2002-12-19 11:04
2003.01.16
ADO


14-49227
Eraser@YYY
2002-12-23 04:28
2003.01.16
Кольца сатурна


14-49217
nika_ufc
2002-12-29 16:22
2003.01.16
Помагите


1-49039
Serge V
2003-01-07 22:39
2003.01.16
Удалить файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский