Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.06;
Скачать: CL | DM;

Вниз

Работа с потоками   Найти похожие ветки 

 
..::KraN::..   (2007-12-10 15:22) [0]

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


 
trubin ©   (2007-12-10 15:27) [1]

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


 
Dib@zol ©   (2007-12-10 15:29) [2]

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


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

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


 
DiamondShark ©   (2007-12-10 16:19) [4]

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


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

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


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


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


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


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

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


 
DiamondShark ©   (2007-12-10 16:27) [8]

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

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


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

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


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


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

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


 
DiamondShark ©   (2007-12-10 16:31) [11]


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

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

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


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


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

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


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


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

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


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


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


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


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

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


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

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:57) [17]


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

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


 
trubin ©   (2007-12-10 16:58) [18]


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2008.01.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.01 c
2-1197293148
deras
2007-12-10 16:25
2008.01.06
Помогите с запросом


15-1196511475
helpme
2007-12-01 15:17
2008.01.06
Странная повестка, помогите разобраться.


6-1177360433
Sergey M.
2007-04-24 00:33
2008.01.06
Delphi&Cgi


8-1171741173
SONIC90
2007-02-17 22:39
2008.01.06
MediaPlayer On Notify


2-1197120040
dim
2007-12-08 16:20
2008.01.06
Ввод в поле TEdit1