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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2010, 19:06   #1
Sanprof
Форумчанин
 
Аватар для Sanprof
 
Регистрация: 28.01.2008
Сообщений: 267
По умолчанию Передача параметра в поток

здравствуйте, столкнулся с проблемой связанной с потоками, а именно как в поток передать параметр? К примеру:
Код:
type
  TSearchF = class(TThread)
  private
  protected
    procedure Execute; override;
  end;
а потом при выполнении птока
Код:
procedure TSearchF.Execute;
begin
while not Terminated do
  begin
    synchronize(FindFile(Str));
  end;
end;
здесь FindFile(Str) - процедура в главной форме описанная так
при таком вызове делфя ругается типа [Error] Unit2.pas(36): There is no overloaded version of 'Synchronize' that can be called with these arguments
Код:
procedure FindFile(Str: String);

...

Procedure TForm1.FindFile(Str: String);
begin
//Здесь что-то выполняется
end;
Скажу сразу, что в стандартных делфийских демосах этого нету, так что не отсылайте их смотреть, а лучше подскажите по смыслу.
Не забываем говорить спасибо за помощь - это ведь так приятно
Sanprof вне форума Ответить с цитированием
Старый 05.04.2010, 19:27   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

1. Никакого смысла в потоке нет. Т.к. Synchronize выполняет функцию в главном потоке
2. Synchronize требует функцию без параметров что в вашем случае не верно. Надо FindFileA(); а в нем уже пишите FindFile(Str);
3. Передать параметры элементарно, вы описали собственный класс, кто мешает в нем объявить какие-то переменные (аргументы) ?
BOBAH13 вне форума Ответить с цитированием
Старый 05.04.2010, 19:27   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

http://programmersforum.ru/showthrea...t=%EF%EE%EB%FF
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.04.2010, 19:42   #4
Sanprof
Форумчанин
 
Аватар для Sanprof
 
Регистрация: 28.01.2008
Сообщений: 267
По умолчанию

BOBAH13,
Цитата:
1. Никакого смысла в потоке нет. Т.к. Synchronize выполняет функцию в главном потоке
вот именно мне нужно прерывать и восстанавливать процедуру FindFile(str) по нажатию на кнопку
Цитата:
2. Synchronize требует функцию без параметров что в вашем случае не верно. Надо FindFileA(); а в нем уже пишите FindFile(Str);
3. Передать параметры элементарно, вы описали собственный класс, кто мешает в нем объявить какие-то переменные (аргументы) ?
Здесь я не совсем понял, что вы имеете ввиду, если не трудно, можете привести пример!

Пепел Феникса, эту тему уже читал, т.к. я сталкиваюсь с потоками на практике впервые (ранее только в теории), не совсем понял как там решилась проблема.

Вобщем смысл в том, чтобы процедура FindFile(str: String); из главной формы выполнялась в потоке, но обязательно у этой процедуры должен быть параметр Str, т.к. без него мне никак не обойтись, и что бы ее можно было прервать/восстановить по нажатию на кнопку.
Не забываем говорить спасибо за помощь - это ведь так приятно
Sanprof вне форума Ответить с цитированием
Старый 05.04.2010, 20:06   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Код:
type
  TSearchF = class(TThread)
  private
  protected
    procedure Execute; override;
  public
    Str: String; // думаю назначение обоих 
    Pause: Boolean; // параметров объяснять не надо
  end;
и

Код:
 procedure TSearchF.Execute;
begin
  while not Terminated do
  begin
     if(Pause) then
     begin
        Sleep(10);
     end else
     begin
        FindFile(Str);
     end;
  end;
end;
Как то так.
BOBAH13 вне форума Ответить с цитированием
Старый 05.04.2010, 21:11   #6
Sanprof
Форумчанин
 
Аватар для Sanprof
 
Регистрация: 28.01.2008
Сообщений: 267
По умолчанию

BOBAH13, как бы не совсем то, вот если я делаю мою процедуру без параметра Str, тоесть synchronize(FindFile);, то все работает на ура, но не до конца, как бы процедура выполняется только на 10%, а с параметром Str на 100% (если не загонять в поток).
Не забываем говорить спасибо за помощь - это ведь так приятно
Sanprof вне форума Ответить с цитированием
Старый 05.04.2010, 21:24   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Честное слово, не могу понять кто вам мешает передать Str экземпляру класса потока и выставить Pause = false ? чем не передача параметров ?
p.s. конечно надо будет аккуратней это делать, ну или дополнить код более жесткой синхронизацией.
И еще, повторюсь, если вы вызываете FindFile в потоке (функция Execute) и при этом пишите Synchronize(FindFile) то толку от вашего потока НОЛЬ, т.к. тело функции FindFile будет выполняться в главном потоке, для того и сделан Synchronize.
BOBAH13 вне форума Ответить с цитированием
Старый 12.11.2013, 15:30   #8
DimensionSlider
Новичок
Джуниор
 
Регистрация: 15.05.2012
Сообщений: 1
По умолчанию

Извините за некропостинг.
Искал решение, наткнулся на тему, нашел еще одно решение, грех не отписаться.

Можно делать вот так чтобы не заводить левые поля
Код:
procedure TScanThread.CreateNewJobFromThread( filePath: string );
begin
  Synchronize(
    procedure
    begin
      CreateNewjob( ExtractFileName( filePath ) );
    end
   );
end;
Или даже не создавая новых отдельных методов прямо в коде вашей функции оборачивать любые действия с формой в
Код:
  Synchronize(
    procedure
    begin
      mainForm.Memo.Lines.Add('11212');
    end
   );

Последний раз редактировалось DimensionSlider; 12.11.2013 в 16:13.
DimensionSlider вне форума Ответить с цитированием
Старый 13.11.2013, 08:55   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Так можно делать только в дельфи выше 2009 версии, в которой появились анонимные методы (так правильно называется то , что Вы описываете).
И эта техника никак не зависит от многопоточной технологии, она самостоятельная.
phomm вне форума Ответить с цитированием
Старый 21.11.2013, 13:28   #10
de_guta
 
Регистрация: 09.09.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от DimensionSlider Посмотреть сообщение
Извините за некропостинг.
Искал решение, наткнулся на тему, нашел еще одно решение, грех не отписаться.
Чувак, спасибо за твой некропост), реально удобная штука, теперь буду знать.
de_guta вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача параметра по ссылке veter_s_morya PHP 7 18.10.2009 16:43
Передача функции как параметра ezus Общие вопросы C/C++ 2 24.08.2009 10:19
Передача имени класса как параметра Квэнди Общие вопросы Delphi 14 06.04.2009 20:09
Передача строки-как параметра-переменной Иллидан Общие вопросы Delphi 13 03.10.2008 18:40
Передача параметра в поток joker Win Api 10 22.12.2007 12:53