Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с потоками [D2005, XP]


..::KraN::.. ©   (2007-12-10 15:22:00) 

У меня есть функция, в которой присутствует цикл (ищет и удалят символы в TMemo), возвращает значение string, и имеет входящий параметр s:string. Как это можно реализовать, но чтобы потом в переменную, скажем, str возвращался результат работы функции. Желательно поподробнее.


trubin   (2007-12-10 16:58:00) [1]


> Забыл написать (как поместить эту функкцию в поток), т.к.
>  она грузит очень сильно проц.


Видимо внешне это выражается в подвисании GUI программы

Можно запускать ее в основном потоке, но в итерациях цикла вызывать application.ProcessMessages, чтобы сообщения обрабатывались.


..::KraN::..   (2007-12-10 16:57:00) [2]


> Palladin ©   (10.12.07 16:54) [16]

Спасибо, попробую!


Palladin   (2007-12-10 16:54:00) [3]

TMyThread=Class(TThread)
 Private
  m_strData:String;
  m_strResult:String;
 Protected
  Procedure Execute; Override;
 Public
  Constructor Create(Const s:String);
  Property Result:String Read m_strResult;
End;

Constructor TMyThread.Create;
Begin
 m_strData:=s;
 Inherited Create(True);
 Priority:=tpLower;
 Resume;
End;

Procedure TMyThread.Execute;
Var
 s:String;
Begin
 For i:=0 to чего то там Do
  Begin
   If Terminated Then Exit;
   чего то делаем
  End;
m_strResult:=s;
End;

Procedure TForm.ButtonStopClick(Sender:TObject);
Begin
MyThread.Terminate;
// можно и подождать MyThread.WaitFor;
End;


..::KraN::..   (2007-12-10 16:49:00) [4]

А как ещё можно?


Сергей М.   (2007-12-10 16:40:00) [5]


> надо сделать так, чтобы выполнение этой функции можно было
> бы отменить


И для этого функцию нужно непременно поместить в поток ?


..::KraN::..   (2007-12-10 16:32:00) [6]


> где ж ты интересно спросил то...

Вот здесь...
> ..::KraN::..   (10.12.07 16:17) [3]


Palladin   (2007-12-10 16:31:00) [7]


> Вот я и спрашиваю, как вообще создать поток

где ж ты интересно спросил то... перечитал вопрос нифига не нашел...


DiamondShark   (2007-12-10 16:31:00) [8]


> потому что у меня его вообще нет.

А он тебе вообще нужен?
Вот мы тебе нарисуем, как "поместить в поток", а потом ты придёшь спрашивать, как тебе прервать поток.

У тебя в функции есть место, где её можно корректно прервать? Без насилия над логикой?


..::KraN::..   (2007-12-10 16:29:00) [9]


> а вообще подозреваю что тело потока организовано кривося
> накося и/или, с подачи Арзангельского, все делается в Synchronize.
> ..

Вот я и спрашиваю, как вообще создать поток, потому что у меня его вообще нет.


Palladin   (2007-12-10 16:27:00) [10]

кстати, а правда... :) где потоки то в вопросе...


DiamondShark   (2007-12-10 16:27:00) [11]

Так это совсем другой вопрос, касающийся "помещения в поток" весьма левым боком.

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


Palladin   (2007-12-10 16:25:00) [12]

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


Сергей М.   (2007-12-10 16:25:00) [13]


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


И каким по логике должен быть этот результат, если выполнение функции отменено "нажатием на кнопку" ?


..::KraN::..   (2007-12-10 16:21:00) [14]

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


DiamondShark   (2007-12-10 16:19:00) [15]

Думаешь, помещённая в поток она будет "грузить проц" меньше? С чего бы это...


..::KraN::..   (2007-12-10 16:17:00) [16]

Забыл написать (как поместить эту функкцию в поток), т.к. она грузит очень сильно проц.


Dib@zol   (2007-12-10 15:29:00) [17]

%)
Ваще нихига не понял.
У тебя есть функция. Так? Так.
Она способна возвращать значение типа string.
Ну дык вот ты и берёшь свою переменную str и присваиваешь ей результат, который вернула функция.
Ъ?


trubin   (2007-12-10 15:27:00) [18]

Странно заголовок топика "Работа с потоками", а в вопросе про потоки не слова :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо