![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 04.02.2007
Сообщений: 37
|
![]()
Здравствуйте уважаемые коллеги!
У меня появилась следующая задачка. У меня в программе можно создавать любое количество потоков, которые выполняют каждый свой скрипт. Так в скрипте эсть возможность вызывать свои диалоговые формы, и воспламеняющиеся формы(как в QIP). Формы я реализовал свои, как наследники от TForm, но это не столь важно. Проблема заключается в том, что эти формы должны быть абсолютно независимыми, и фукция которая их создает, должна видеть все остальные формы что б правильно рассчитать координаты новой формы. Это нужно для воспламеняющиеся форм, они появляются одна над другой, возле трая. Так вот, с одним или двомя потоками всьо ок, но если из запустить 5-10 штук, начинают вылазить глюки синхронизации. То Access Vialation, то глюки прорисовки. Перелопатил кучу доки, но нигде нормально не описана работа потоков с интерфейсом, максимум вызов через synchronize(). У кого есть идеи, или ссылки на нужную инфу? Помогите пожалуйста! ![]()
Не грузи, и не грузим будешь...
|
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 12.05.2007
Сообщений: 373
|
![]()
попробуй завести глобальную переменную с которой читай координаты предыдущей формы.. и пиши новые координаты низа (для седующей формы).. когда окно появляется увеличивай переменную когда убирается уменьшай.. все просчто.. но тут может возникнуть проблема с доступом к ней.. так как пару потоков сразу на нее ломануться.. как и везде "одновременно" они не будут получать доступ.. какойто поток на долю микросекунды раньше.. а остальные пусть проверяють занятость переменной. и если знята - то ждать..
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен: "Перемен!Мы ждем перемен!" |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 04.02.2007
Сообщений: 37
|
![]()
Хм.. Я делаю приблезительно так же, но проблема немного не в том. Я немного намутил в вопросе, попробую упростить:
Есть форма с кнопочкой, если нажать на нее должны создаться 10 потоков, и каждый из них должен создать еще по форме и показать из ShowModal. И того у меня должно быть 10 модальных форм которые не блокируют друг друга. Как сделать чтобы эта вся штука не вылетала???
Не грузи, и не грузим будешь...
|
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]()
Посмотрите пример
|
![]() |
![]() |
![]() |
#5 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]()
Идея такова.
1. создать в общем классе, или как общую переменную список TList. 2. в этот самый список, при создании каждого потока добовлять себя(этот поток) при вызове деструктора данного потока удалять из этого списка. 3. если речь о модальных окнах, то не понятно, причем тут общая переменная. При создании каждого потока, есть возможность передавать параметры (или же создать свой-во у потомка TThread), собственно сделать какую-то структуру с вашей информацией и создать в главном (родительском потоке) там где и список с потоками эту структуру. После при создании потока (дочернего) передавать ему указатель на эту структуру, так же не забывать отключить FreeOnTerminate у дочерних потоков. В дополнее скажу, для синхронизации можно использовать события SetEvent (и другое см. в MSDN), или же просто критические секции CriticalSection (так же в MSDN) очень эффективно если требуется синхронизированное обращение к общим данным. |
![]() |
![]() |
![]() |
#6 | |
Форумчанин
Регистрация: 28.09.2008
Сообщений: 344
|
![]() Цитата:
Может лучше использовать Код:
|
|
![]() |
![]() |
![]() |
#7 | |||
Пользователь
Регистрация: 04.02.2007
Сообщений: 37
|
![]()
alexBlack - спасибо за пример. Честно говоря не подумал про такой вариант. Правда немного смущает выполнение всего в основном потоке с постоянно проверяющим таймером "а не нужно ли что-то создать или удалить", но если не удастся полностью переложить GUI на потоки, то буду развивать эту идею.
Цитата:
Цитата:
![]() Цитата:
Код:
![]()
Не грузи, и не грузим будешь...
|
|||
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 28.09.2008
Сообщений: 344
|
![]()
Может как-то так:
ThreadGUI.zip |
![]() |
![]() |
![]() |
#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 |