![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с потоками [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]Странно заголовок топика "Работа с потоками", а в вопросе про потоки не слова :)