Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.02.2012, 18:13
isp isp вне форума
Прохожий
 
Регистрация: 31.01.2012
Сообщения: 6
Репутация: 10
Печаль многопоточность. вызов дополнительной формы

имеется многопоточная программа, потоки в ней задаются пользовательски, т.е. количество потоков может быть любое.

кроме главной формы, есть еще дополнительная.
в процессе выполнения потоками своей работы, вызывается дополнительная форма для ввода туда информации, после чего поток продолжает свою
работу, потом другой поток открывает дополнительную форму и вводим
снова туда информацию. так вот это реализовать у меня не получается.

появляется дополнительная форма лишь раз от одного потока, потом она
появляется, но программа "висит наглухо", невозможно ничего ввести в форму.

подскажите как это можно реализовать? спасибо!
Ответить с цитированием
  #2  
Старый 04.02.2012, 08:34
Аватар для DelphiM0ZG
DelphiM0ZG DelphiM0ZG вне форума
Новичок
 
Регистрация: 22.10.2011
Сообщения: 62
Репутация: 666
По умолчанию

Что-то как-то запутано. Мне не понятно зачем использовать поток для вызова формы и ввода данных в неё. Я бы использовал поток для формирования сложного отчёта или копирования (перемещения) большого файла, если Application.ProcessMessages не прокатывает или чем-то не устраивает. На практике использовал потоки для визуализации алгоритмов шифрования. Чтобы прога не зависала во время цикла, обычно хватает этого: Application.ProcessMessages. Может тогда как-нибудь по таймеру сделать есть вариант?
__________________
Чем больше знаешь, тем сильнее осознаёшь, что знаешь гораздо меньше, чем не знаешь!..
Ответить с цитированием
  #3  
Старый 04.02.2012, 15:12
isp isp вне форума
Прохожий
 
Регистрация: 31.01.2012
Сообщения: 6
Репутация: 10
Печаль

Цитата:
Сообщение от DelphiM0ZG
Что-то как-то запутано. Мне не понятно зачем использовать поток для вызова формы и ввода данных в неё. Я бы использовал поток для формирования сложного отчёта или копирования (перемещения) большого файла, если Application.ProcessMessages не прокатывает или чем-то не устраивает. На практике использовал потоки для визуализации алгоритмов шифрования. Чтобы прога не зависала во время цикла, обычно хватает этого: Application.ProcessMessages. Может тогда как-нибудь по таймеру сделать есть вариант?

допустим создается 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  
Старый 07.02.2012, 16:31
isp isp вне форума
Прохожий
 
Регистрация: 31.01.2012
Сообщения: 6
Репутация: 10
Лампочка

проблема решена, тему, впринципе, можно закрывать, лишь хотел задать один вопрос.

Код:
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.

заморачиваться особо не стал с поиском или динамическим созданием компонента на дополнительной форме, поэтому решил оставить так, НО, возможно, у вас будут какие-либо рациональные предложения по обмену данными с дополнительной формой из потока, не совсем "увеличивающие" код.

буду премного благодарен.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:07.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025