Member
Статус: Не в сети Регистрация: 30.04.2004 Откуда: [Omsk Team]
Halst надо наследовать класс от TThread, перегрузить его метод Execute, добавив там Synchronize(ваша функция потока) и создать, где нужно экземпляр этого класса...
_________________ forum.omskteam.ru- Все о керамограните
Member
Статус: Не в сети Регистрация: 13.02.2004 Откуда: Вологда-Москва
значит так:
фигачу новый клас:
Код:
type TFileThread = class(TThread) //Новый класс private answer:Integer; protected procedure <ПРОЦЕДУРА>; end; делаю свою нужную процедуру <ПРОЦЕДУРА> и потом, где надо её врубить, делаю: var fThread: TFileThread; procedure TForm1.Button1Click(Sender: TObject); begin fThread:=TFileThread.Create(False); end;
правильно понял?
Добавлено спустя 1 минуту, 29 секунд: в смысле вместо TForm1.Button1Click ставить <ПРОЦЕДУРА>
Member
Статус: Не в сети Регистрация: 30.04.2004 Откуда: [Omsk Team]
Код:
uses Classes;
type TFileThread = class(TThread) //Новый класс private answer:Integer; protected procedure [b]Твоя процедура[/b]; [b]procedure Execute; override;[/b] end;
Цитата:
в смысле вместо TForm1.Button1Click ставить <ПРОЦЕДУРА>
нет! TForm1.Button1Click это процедура, создающая поток! она может быть любой, хоть щелчок по кнопке, хоть что-то еще...
Код:
fThread:=TFileThread.Create(False);
и этот поток сразу начинает выполнятся
Добавлено спустя 2 минуты, 7 секунд: Execute - это то, что делает основной поток, его работа синхронизируется с твоей функцией в самой Execute(обрати внимание на код для нее)
_________________ forum.omskteam.ru- Все о керамограните
Member
Статус: Не в сети Регистрация: 13.02.2004 Откуда: Вологда-Москва
попробую. если не получится сюда запостю
Добавлено спустя 22 минуты, 10 секунд: че-то не фурычит...
type
TFileThread = class(TThread); //Новый класс
TfrmMain = class(TForm)
...
procedure Button1Click(Sender: TObject); //процедура второй ветви
...
private
answer:Integer;
protected
end;
... потом сама процедура
procedure TfrmMain.Button1Click(Sender: TObject); //то, что во второй ветви
begin
...
end;
..потом в середине другой процедуры, где мне нужна вторая ветвь врубаю fThread:=TFileThread.Create(False); // вот типа врубается вторая ветвь...
компилю... всё ОК, но как только вызываю процедуру с вложеным включением второй ветви, пишет "Abstract Error" с предложением войти в КПУ виндоу...
var result1,result2,result3,result4,result5,result,res,no:integer; f:array[0..50] of string; g:array[0..50,0..5] of integer; y:integer; testdone,TEST_DONE:boolean; Items:integer; Hi:boolean;
procedure TfrmMain.btnBurnClick(Sender: TObject); var b:real; fThread:tthread; //зафигачиваю begin frmBurn.visible:=true; frmMain.Enabled:=false; repeat Application.ProcessMessages; //fThread:=TFileThread.Create(False); // вот типа врубается вторая ветвь... (должна..) b:=(((((1/b)*b))+0.1)/b*b)*(((((1/b)*b))+0.1)); until frmBurn.btnStopBurn.tag=1; frmBurn.btnStopBurn.tag:=10; SpeedButton2Click(frmMain); end
Member
Статус: Не в сети Регистрация: 30.04.2004 Откуда: [Omsk Team]
Код:
type TFileThread = class(TThread); //Новый класс
он здесь объявлен, а в каком юните описание? не нужно, повторяю в n-ый раз этого делать в одном модуле
Код:
repeat Application.ProcessMessages; //fThread:=TFileThread.Create(False); // вот типа врубается вторая ветвь... (должна..)
это вы в цикле потоки создаете? я так понял, что его(цикл) хотите вынести в отдельный поток, если так то код должен быть в функции Execute, которая перегружается в вашем классе, в общем примерно так:
Код:
unit НАЗВАНИЕ_НОВОГО_ЮНИТА!; interface uses Classes;
type TFileThread = class(TThread) protected procedure Execute; override; end; implementation
uses SysUtils, Unit1;
procedure TFileThread.Execute; begin repeat Application.ProcessMessages; b:=(((((1/b)*b))+0.1)/b*b)*(((((1/b)*b))+0.1)); until frmBurn.btnStopBurn.tag=1; end; end.
и вообще зачем создавать поток, если все равно нужно дождаться результата его выполнения, это можно сделать простым ProcessMessages? а там, где хотим создать поток и сделать что либо по окончании его работы пишем:
Member
Статус: Не в сети Регистрация: 13.02.2004 Откуда: Вологда-Москва
во блин. кто-то из нас не понял. кажется это я...
мне надо чтобы какое-то математическое выражение выполнялось паралельно с другим
repeat
Application.ProcessMessages;
//fThread:=TFileThread.Create(False); // вот типа врубается вторая ветвь... (должна..)
b:=(((((1/b)*b))+0.1)/b*b)*(((((1/b)*b))+0.1));
Вот это выражение (пока условное) и паралельно должно идти такое-же
И можно попроще: я недавно только с паскаля пересел
Member
Статус: Не в сети Регистрация: 30.04.2004 Откуда: [Omsk Team]
каким я вижу решение вашей задачи у нас есть кнопка, при нажатии на нее я хочу, чтобы создавалось два потока в которых вычисляются два мат. выражения, в процедуре нажатия кнопки мы вставляем только:
Код:
fThread:=TFileThread.Create(False);
эта строчка создаст потоки... для того, чтобы она работала нам нужен новый класс с функциями Execute()(там вычисляется мат выражение) и функцией для второго выражения, положим это интеграл - Integral();
Код:
unit НАЗВАНИЕ_НОВОГО_ЮНИТА; interface uses Classes;
procedure TFileThread.Integral; begin //всякие методы Симсона :) end; procedure TFileThread.Execute; begin repeat b:=(((((1/b)*b))+0.1)/b*b)*(((((1/b)*b))+0.1)); Synchronize(Integral); //это обеспечит нам синхронное выполнение вычислений until УСЛОВИЕ_ПРЕКРАЩЕНИЯ_ВЫЧИСЛЕНИЙ; end; end.
не люблю этот делфи, классы всякие, компонентики, а чтоб мозгой шевельнуть... щас бы
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Halst Где ты видел Execute у каласса TForm? Он у класса TThread. может всеже возмеш да и прочтеш наконец немного документацию? Потоки простешая вещь и уж за время существования этой ветки можно было наверное малость поднапрячься, а?
Member
Статус: Не в сети Регистрация: 30.04.2004 Откуда: [Omsk Team]
Ray Adams совершенно с вами согласен Halst
Код:
TFileThread = class(TThread);
эта строчка прото создаст наследника класса,без всяких перегрузок и новых функции, компилятор посчитает, что Execute и Integral относятся к TfrnMain, вперед на гугл, поиск работа с классами в делфи/паскале 10 раз сказал, что новый класс желательно бы вынести в отдельный юнит, религия что ли не позоляет?
_________________ forum.omskteam.ru- Все о керамограните
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения