Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2012, 15:04   #1
ispro
Пользователь
 
Регистрация: 04.02.2012
Сообщений: 21
Печаль многопоточность. вызов дополнительной формы.

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

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

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

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

также, так как форма еще не создана, я не могу передать данные в тот же компонент 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);
то как уже сказал отображается картинка только последнего потока.

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

примного благодарен!
ispro вне форума Ответить с цитированием
Старый 04.02.2012, 15:33   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

в потоков задать свойства через property и передать в них все необходимое ДО запуска потоков.
Человек_Борща вне форума Ответить с цитированием
Старый 04.02.2012, 16:46   #3
ispro
Пользователь
 
Регистрация: 04.02.2012
Сообщений: 21
Смущение

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
в потоков задать свойства через property и передать в них все необходимое ДО запуска потоков.
не могли бы вы более подробно описать данный способ или привести небольшой пример?
в доп. форму необхдимо передать следующие данные: name_u, name_pic, от формы потоку необходимо получить result.

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

я в принципе организовал необходимую функцию программы другим способом, НО хочется для саморазвития все-таки сделать так как хотел ранее.

примного благодарен!
ispro вне форума Ответить с цитированием
Старый 07.02.2012, 16:34   #4
ispro
Пользователь
 
Регистрация: 04.02.2012
Сообщений: 21
По умолчанию

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

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

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

буду премного благодарен.
ispro вне форума Ответить с цитированием
Старый 07.02.2012, 17:01   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
var
 b: Tform;
так ведь объявлено? тогда можно так
Код:
f:=tformclass(findClass('TForm4'));
b:=f.create(Application);
(b as TForm4).Edit1.text:=.........
(b as Tform4).Image1.LoadFrom(....);
или же так
Код:
var
 b: Tform4;
Код:
f:=tformclass(findClass('TForm4'));
b:=f.create(Application) as Tform4;
и далее просто
Код:
b.Edit1text:=.........
b.Image1.LoadFrom(....);
а еще можно для каждого потока создавать свою форму (внутри syncronize) и хранить ее как private данные.
тоже что и у тебя но переменная b объявляется в закрытой (private) облcnb данных класса потока.
но показывать и общаться с ней все равно надо через synchronize.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.02.2012, 18:29   #6
ispro
Пользователь
 
Регистрация: 04.02.2012
Сообщений: 21
По умолчанию

сделал через синхронизацию следующим образом:

Код:
procedure TNewThread.Enc;
begin
try
f:=tformclass(findClass('TForm4'));
b:=f.create(Application) as TForm4;
b.img.Picture.LoadFromFile(name_pic);
b.ShowModal;
i_fresh:=b.edt1.Text;
finally
b.Free;
end;
end;
возникла следующая проблема-при открытии формы в ней отображается нужная картинка и сразу же заменяется следующей(в случае только с первой самой картнкой из всех), но данные передаются нужному потоку.

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

можно ли как решить эту проблему при синхронизации?
ispro вне форума Ответить с цитированием
Старый 07.02.2012, 19:11   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

что есть переменная b? (где определена)?
в приведенном примере можно ее вполне сделать локальной переменной функции.
Локальность даст возможность каждому потоку работать толлько со своей формой.
вероятно просто несколько форм (из разных потоков) показываютя одновременно на одном и том же месте.
попробуй для разных потоков задать разные положенbя форм.
form.left:=
form.top:=
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 07.02.2012 в 19:14.
evg_m вне форума Ответить с цитированием
Старый 07.02.2012, 21:50   #8
ispro
Пользователь
 
Регистрация: 04.02.2012
Сообщений: 21
Радость

переменная b:

Код:
...
 TNewThread = class(TThread)
  private
    ...
    f:TFormClass;
    b:TForm4;
  protected
    procedure Execute; override;
...
пробовал задавать локально, но тогда данные полученые от формы передаются некорректно(одни и теже данные в нескольких потоках).

да, действительно, вы правы открывалось несколько окон, но также и повторялись картинки в дополнительной форме.

открытие нескольких окон поборол "извращенским" способом:
Код:
cs.Enter;
Synchronize(Encap);
cs.Leave;


а одни те же картинки иногда показывались потому что имя картинки, в период тестирования программы, задавал следующим образом:
Код:
name_pic:=IntToStr(acc)+'.jpg';
где acc-локальная перименная:
Код:
cs.Enter;
Inc(Acc);
if acc>ttt then work:=False;
cs.Leave;
исправил код на следующий:
Код:
cs.Enter;
Inc(Acc);
if acc>ttt then work:=False else curacc:=acc;
cs.Leave;
.....
name_pic:=IntToStr(curacc)+'.jpg';
и в период тестирования, программа заработала должным образом
ispro вне форума Ответить с цитированием
Старый 08.02.2012, 09:19   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

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

кроме главной формы, есть еще дополнительная. в процессе выполнения потоками своей работы, вызывается дополнительная форма для ввода туда информации, после чего поток продолжает свою работу с полученными данными от дополнительной формы. потом другой поток открывает дополнительную форму и вводим снова туда информацию.
Цитата:
в потоков задать свойства через property и передать в них все необходимое ДО запуска потоков.
Код:
MyTread:=TMythread.Create(resume); // создать поток в остановленном состоянии. 
f.showModal; // вызвать форму настройки 
теперь она может быть одна для всех (не создавать каждый раз заново)
но можно и создавать (но тогда и не забыть удалить)
mythread.myparam:=f.datathread; // перенести полученные данные в поток.
mythread.resume; // запустить поток.
Избавимся от всей головной боли. (критичической секции)
и многих-многоих форм
Цитата:
пробовал задавать локально, но тогда данные полученые от формы передаются некорректно(одни и теже данные в нескольких потоках).
Такого быть не должно. Вероятно где-то работаем не с тем, что предполагаем. скорее всего есть какие-то глобальные переменные (наверно оставшиеся от предыдущих попыток).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.02.2012, 22:25   #10
ispro
Пользователь
 
Регистрация: 04.02.2012
Сообщений: 21
Вопрос

Цитата:
Сообщение от evg_m Посмотреть сообщение
есть мнение что возможно пересмотреть алгоритм работы в целом.
Код:
MyTread:=TMythread.Create(resume); // создать поток в остановленном состоянии. 
f.showModal; // вызвать форму настройки 
теперь она может быть одна для всех (не создавать каждый раз заново)
но можно и создавать (но тогда и не забыть удалить)
mythread.myparam:=f.datathread; // перенести полученные данные в поток.
mythread.resume; // запустить поток.
Избавимся от всей головной боли. (критичической секции)
и многих-многоих форм
возник вопрос, я смогу внести данные только перед запуском потока или в любой момент смогу вызвать форму? моя программа работает, работает пока не встертит нужное и выведит в дополнительной форме.
ispro вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность, обратный вызов BOBAH13 Свободное общение 0 11.12.2011 03:24
Вызов формы 2 и активация формы 1 xRamzeSx Общие вопросы Delphi 2 12.01.2011 08:13
Создание и вызов формы из консоли Gr1ng0 Общие вопросы C/C++ 5 26.11.2010 09:54
открытие картинки без дополнительной формы grom333 Помощь студентам 9 12.01.2010 19:56
Вызов формы в C++ Скарам Помощь студентам 4 07.10.2009 17:33