|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
01.08.2009, 14:29 | #1 |
Пользователь
Регистрация: 04.02.2007
Сообщений: 37
|
TThread и GUI
Здравствуйте уважаемые коллеги!
У меня появилась следующая задачка. У меня в программе можно создавать любое количество потоков, которые выполняют каждый свой скрипт. Так в скрипте эсть возможность вызывать свои диалоговые формы, и воспламеняющиеся формы(как в QIP). Формы я реализовал свои, как наследники от TForm, но это не столь важно. Проблема заключается в том, что эти формы должны быть абсолютно независимыми, и фукция которая их создает, должна видеть все остальные формы что б правильно рассчитать координаты новой формы. Это нужно для воспламеняющиеся форм, они появляются одна над другой, возле трая. Так вот, с одним или двомя потоками всьо ок, но если из запустить 5-10 штук, начинают вылазить глюки синхронизации. То Access Vialation, то глюки прорисовки. Перелопатил кучу доки, но нигде нормально не описана работа потоков с интерфейсом, максимум вызов через synchronize(). У кого есть идеи, или ссылки на нужную инфу? Помогите пожалуйста!
Не грузи, и не грузим будешь...
|
01.08.2009, 16:48 | #2 |
Форумчанин
Регистрация: 12.05.2007
Сообщений: 373
|
попробуй завести глобальную переменную с которой читай координаты предыдущей формы.. и пиши новые координаты низа (для седующей формы).. когда окно появляется увеличивай переменную когда убирается уменьшай.. все просчто.. но тут может возникнуть проблема с доступом к ней.. так как пару потоков сразу на нее ломануться.. как и везде "одновременно" они не будут получать доступ.. какойто поток на долю микросекунды раньше.. а остальные пусть проверяють занятость переменной. и если знята - то ждать..
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен: "Перемен!Мы ждем перемен!" |
01.08.2009, 17:36 | #3 |
Пользователь
Регистрация: 04.02.2007
Сообщений: 37
|
Хм.. Я делаю приблезительно так же, но проблема немного не в том. Я немного намутил в вопросе, попробую упростить:
Есть форма с кнопочкой, если нажать на нее должны создаться 10 потоков, и каждый из них должен создать еще по форме и показать из ShowModal. И того у меня должно быть 10 модальных форм которые не блокируют друг друга. Как сделать чтобы эта вся штука не вылетала???
Не грузи, и не грузим будешь...
|
01.08.2009, 19:33 | #4 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Посмотрите пример
|
02.08.2009, 00:06 | #5 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Идея такова.
1. создать в общем классе, или как общую переменную список TList. 2. в этот самый список, при создании каждого потока добовлять себя(этот поток) при вызове деструктора данного потока удалять из этого списка. 3. если речь о модальных окнах, то не понятно, причем тут общая переменная. При создании каждого потока, есть возможность передавать параметры (или же создать свой-во у потомка TThread), собственно сделать какую-то структуру с вашей информацией и создать в главном (родительском потоке) там где и список с потоками эту структуру. После при создании потока (дочернего) передавать ему указатель на эту структуру, так же не забывать отключить FreeOnTerminate у дочерних потоков. В дополнее скажу, для синхронизации можно использовать события SetEvent (и другое см. в MSDN), или же просто критические секции CriticalSection (так же в MSDN) очень эффективно если требуется синхронизированное обращение к общим данным. |
02.08.2009, 11:21 | #6 | |
Форумчанин
Регистрация: 28.09.2008
Сообщений: 344
|
Цитата:
Может лучше использовать Код:
|
|
03.08.2009, 11:21 | #7 | |||
Пользователь
Регистрация: 04.02.2007
Сообщений: 37
|
alexBlack - спасибо за пример. Честно говоря не подумал про такой вариант. Правда немного смущает выполнение всего в основном потоке с постоянно проверяющим таймером "а не нужно ли что-то создать или удалить", но если не удастся полностью переложить GUI на потоки, то буду развивать эту идею.
Цитата:
Цитата:
Цитата:
Код:
Не грузи, и не грузим будешь...
|
|||
03.08.2009, 19:42 | #8 |
Форумчанин
Регистрация: 28.09.2008
Сообщений: 344
|
Может как-то так:
ThreadGUI.zip |
05.08.2009, 11:50 | #9 |
Пользователь
Регистрация: 04.02.2007
Сообщений: 37
|
Спасибо всем кто ответил!
Интергировать формы коректно так и не получилось. Сделал так, потоки создают переменную моего типа TMessageQuery куда записывают заголовок, текст, набор кнопок, тип диалога и т.д., помещают его в защищенный список TTreadList, и зацикливаются. Код:
А в главном потоке по таймеру проверял не появилось ли чего нового в очереди, если появилось - создавал форму. Здесь же проверял не нажали чего на форме, если нажали Код:
Правда это получилась эмуляция того что я хотел, но проблему решило! Еще раз всем спасибо, кто принял участие в обсуждении!
Не грузи, и не грузим будешь...
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
TThread в С++ Builder | alun | C++ Builder | 7 | 02.06.2010 21:55 |
Метод Synchronize класса TThread | EdNovice | Общие вопросы Delphi | 10 | 01.08.2009 14:47 |
COM, TThread, обращение по таймеру | Антон Ю.Б. | Общие вопросы Delphi | 2 | 17.02.2009 09:23 |
использование TThread | amandra | Общие вопросы Delphi | 6 | 03.05.2008 03:13 |
Stack owerflow - глюки с TThread | IOrist | Общие вопросы Delphi | 4 | 11.11.2007 09:13 |