Последние записи
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
- wprintf как напечатать кириллицу
- Взаимодействие через командную строку
- Сравнение языков на массивах. Часть 1
- Сравнение языков по скорости
- Чтение огромных xml-файлов
- Как в Python+Selenium webdriver открыть новую вкладку в уже открытом браузере?
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
13th
Мар
TThread и GUI
Posted by maloy under Delphi, Архив
Freezer
У меня появилась следующая задачка. У меня в программе можно создавать любое количество потоков, которые выполняют каждый свой скрипт. Так в скрипте эсть возможность вызывать свои диалоговые формы, и воспламеняющиеся формы(как в QIP). Формы я реализовал свои, как наследники от TForm, но это не столь важно. Проблема заключается в том, что эти формы должны быть абсолютно независимыми, и функция которая их создает, должна видеть все остальные формы что б правильно рассчитать координаты новой формы. Это нужно для воспламеняющиеся форм, они появляются одна над другой, возле трея. Так вот, с одним или двумя потоками все ок, но если из запустить 5-10 штук, начинают вылазить глюки синхронизации. То Access Vialation, то глюки прорисовки. Перелопатил кучу доки, но нигде нормально не описана работа потоков с интерфейсом, максимум вызов через synchronize().
У кого есть идеи, или ссылки на нужную инфу?
BOBAH13
Идея такова.
1. создать в общем классе, или как общую переменную список TList.
2. в этот самый список, при создании каждого потока добовлять себя(этот поток) при вызове деструктора данного потока удалять из этого списка.
3. если речь о модальных окнах, то не понятно, причем тут общая переменная. При создании каждого потока, есть возможность передавать параметры (или же создать свой-во у потомка TThread), собственно сделать какую-то структуру с вашей информацией и создать в главном (родительском потоке) там где и список с потоками эту структуру. После при создании потока (дочернего) передавать ему указатель на эту структуру, так же не забывать отключить FreeOnTerminate у дочерних потоков.
В дополнение скажу, для синхронизации можно использовать события SetEvent (и другое см. в MSDN), или же просто критические секции CriticalSection (так же в MSDN) очень эффективно если требуется синхронизированное обращение к общим данным.
Freezer
Интергировать формы коректно так и не получилось.
Сделал так, потоки создают переменную моего типа TMessageQuery куда записывают заголовок, текст, набор кнопок, тип диалога и т.д., помещают его в защищенный список TTreadList, и зацикливаются.
function KShowDialog(Caption : string; Text: String; Buttons : array of TVcButtonKind; Style : TVcMassageStyle; Icon : TVcIcon): TVcResult;
var q : TMessageQuery;
begin
q := TMessageQuery.Create(Caption, Text, Buttons, Style, Icon);
RList.Add(q);
while (q.Result = vcrNone) and not (Application.Terminated) do begin
Application.ProcessMessages;
SleepEx(1, true);
end;
Result := q.Result;
RList.Remove(q);
q.Free;
end;
К стати метод TMessageQuery.GetResult тоже делал через TCriticalSection.
А в главном потоке по таймеру проверял не появилось ли чего нового в очереди, если появилось — создавал форму. Здесь же проверял не нажали чего на форме, если нажали
q.Result := dlg.result;
и прячу форму.
Правда это получилась эмуляция того что я хотел, но проблему решило!
тема на форуме от 2009 года
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)