![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() имеется многопоточная программа, потоки в ней задаются пользовательски, т.е. количество потоков может быть любое.
кроме главной формы, есть еще дополнительная. в процессе выполнения потоками своей работы, вызывается дополнительная форма для ввода туда информации, после чего поток продолжает свою работу, потом другой поток открывает дополнительную форму и вводим снова туда информацию. так вот это реализовать у меня не получается. появляется дополнительная форма лишь раз от одного потока, потом она появляется, но программа "висит наглухо", невозможно ничего ввести в форму. подскажите как это можно реализовать? спасибо! |
#2
|
||||
|
||||
![]() Что-то как-то запутано. Мне не понятно зачем использовать поток для вызова формы и ввода данных в неё. Я бы использовал поток для формирования сложного отчёта или копирования (перемещения) большого файла, если Application.ProcessMessages не прокатывает или чем-то не устраивает. На практике использовал потоки для визуализации алгоритмов шифрования. Чтобы прога не зависала во время цикла, обычно хватает этого: Application.ProcessMessages. Может тогда как-нибудь по таймеру сделать есть вариант?
Чем больше знаешь, тем сильнее осознаёшь, что знаешь гораздо меньше, чем не знаешь!.. |
#3
|
|||
|
|||
![]() Цитата:
допустим создается 40 потоков, в каждом потоке работает цикл, когда поток находит необходимые данные, он выводит их мне в доп. форме, я отправляю ему данные, поток продолжает свою работу. необходимые данные - изображения, поэтому програмно трудно их обработать. да и хочется сделать, так как описал, для своего развития можно сказать ![]() вызов формы делаю через процедуру синхронизации, при этом поток, вызвавший дополнительную форму, приостанавливает свою работу. после закрытия формы поток продолжает свою работу. но у меня возникла проблема с обменом информации потока с дополнительной формой. последний поток, открывший доп. форму, как бы "перебивает" данные полученные ранее от потоков и выводится информация во всех открывшихся формах последнего потока. получает же информацию от формы, также только последний, открывший форму, поток. также, так как форма еще не создана, я не могу передать данные в тот же компонент Img класса timage. создаю компонент динамически, все равно не передает данные-ошибка. Код:
f:=tformclass(findClass('TForm4')); b:=f.create(application); b.Caption:=login; img:=TImage.Create(Application); with img do begin Top:=16; Left:=16; Height:=74; Width:=212; end; b.InsertControl(img); b.img.Picture.LoadFromFile(name_pic); b.ActiveControl:=edites; b.Show; а если заранее задать img и открыть уже в дополнительной форме: Код:
img.Picture.LoadFromFile(name_pic); то как уже сказал отображается картинка только последнего потока. подскажите, пожалуйста, как реализовать удачный обмен информации между дополнительной формой и всеми потоками программы. примного благодарен! |
#4
|
|||
|
|||
![]() проблема решена, тему, впринципе, можно закрывать, лишь хотел задать один вопрос.
Код:
cs.Enter; try f:=tformclass(findClass('TForm4')); b:=f.create(Application); b.Caption:=name_pic; b.ShowModal; i_fresh:=b.Caption; finally b.Free; end; cs.Leave; как видно из кода, обмен потока с дополнительной формой получился лишь с помощью caption дополнительной формы, так как при создании формы поток не видит ни компонента timage, ни edit. заморачиваться особо не стал с поиском или динамическим созданием компонента на дополнительной форме, поэтому решил оставить так, НО, возможно, у вас будут какие-либо рациональные предложения по обмену данными с дополнительной формой из потока, не совсем "увеличивающие" код. буду премного благодарен. |