Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 21 • Страница 1 из 21  2  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 13.02.2004
Откуда: Вологда-Москва
сабж.



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 23.10.2003
Откуда: Иркутск/Майкоп
Э... в Demos есть пример. С сортировкой.

_________________
Края каждого совершенно нового крышка процессора не на 100% гладкая. Это связано с тем, что следов мастерства не избежать. (c) Али.


 

Member
Статус: Не в сети
Регистрация: 13.02.2004
Откуда: Вологда-Москва
а по конкретней? там их до фига! а так может кто объеснит?


 

Member
Статус: Не в сети
Регистрация: 30.04.2004
Откуда: [Omsk Team]
Halst
надо наследовать класс от TThread, перегрузить его метод Execute, добавив там Synchronize(ваша функция потока) и создать, где нужно экземпляр этого класса...

_________________
forum.omskteam.ru- Все о керамограните


 

Member
Статус: Не в сети
Регистрация: 13.02.2004
Откуда: Вологда-Москва
Dilon
грузануул :)
я же не волшебник, я только учусь... поподробней, если возможно...


 

Member
Статус: Не в сети
Регистрация: 30.04.2004
Откуда: [Omsk Team]
Halst
сори :) вот пример кода юнита нового класса;
Код:
uses
  Classes;

type
  TFileThread = class(TThread) //Новый класс
  private
    answer:Integer;
  protected
    procedure ShowResult;
    procedure Execute; override;
  end;
implementation

uses
  SysUtils, Unit1;

procedure TFileThread.ShowResult;
begin
  Form1.Edit1.Text:=IntToStr(answer);
end;

procedure TFileThread.Execute;
var
  i:Integer;
begin
  for i:=1 to 10000 do
  begin
    answer:=answer+1;
    Synchronize(ShowResult);
  end;
end;

а вот как его использовать
Код:
var
  fThread: TFileThread;
procedure TForm1.Button1Click(Sender: TObject);
begin
  fThread:=TFileThread.Create(False);
end;

_________________
forum.omskteam.ru- Все о керамограните


 

Member
Статус: Не в сети
Регистрация: 13.02.2004
Откуда: Вологда-Москва
тоесть, как я понял надо прописать в тупе ту фигну с верху, а куда совать сому процедуру с второй ветвью?


 

Member
Статус: Не в сети
Регистрация: 30.04.2004
Откуда: [Omsk Team]
Halst
ту фигню пропиши в отдельном юните :)
а процедуру используй там, где тебе нужно создать второй поток...

_________________
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" с предложением войти в КПУ виндоу...

понятно что я что-то не так сделал, но что?


 

Member
Статус: Не в сети
Регистрация: 30.04.2004
Откуда: [Omsk Team]
Halst
у меня есть подозрения, что вы не очень хорошо представляете себе работу с классами :)
выложите сюда полный фрагмент кода, попробуем разобраться...

_________________
forum.omskteam.ru- Все о керамограните


 

Member
Статус: Не в сети
Регистрация: 13.02.2004
Откуда: Вологда-Москва
Dilon предсавление верно на 100% :) щя выыложу...

Добавлено спустя 2 часа, 55 минут, 38 секунд:
полный дак полный...

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ComCtrls, ExtCtrls, jpeg, Menus;

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;

type
  TFileThread = class(TThread); //Новый класс
  TfrmMain = class(TForm)
    gbxTests: TGroupBox;
    cbxTest1: TCheckBox;
    cbxTest2: TCheckBox;
    cbxTest3: TCheckBox;
    cbxTest4: TCheckBox;
    cbxTest5: TCheckBox;
    btnAll: TButton;
    btnClear: TButton;
    btnBurn: TBitBtn;
    btnRunTests: TBitBtn;
    lblT1res: TLabel;
    lblT2res: TLabel;
    lblT3res: TLabel;
    lblT4res: TLabel;
    lblT5res: TLabel;
    gbxTimes: TGroupBox;
    edtTimesRun: TEdit;
    Label1: TLabel;
    UpDown1: TUpDown;
    Bevel1: TBevel;
    Shape1: TShape;
    shpURes: TShape;
    shpR1: TShape;
    shpR2: TShape;
    shpR3: TShape;
    Bevel2: TBevel;
    Label2: TLabel;
    Bevel4: TBevel;
    cbxWRes: TComboBox;
    cbxR1: TComboBox;
    cbxR2: TComboBox;
    cbxR3: TComboBox;
    lblCurrentCPU: TLabel;
    lblR3: TLabel;
    lblR2: TLabel;
    lblR1: TLabel;
    lblURes: TLabel;
    lblResult: TLabel;
    saveRes: TSpeedButton;
    Image1: TImage;
    btnOtchet: TButton;
    SpeedButton1: TSpeedButton;
    cbxEdit: TComboBox;
    Bevel3: TBevel;
    Shape2: TShape;
    memH: TMemo;
    Label3: TLabel;
    SpeedButton2: TSpeedButton;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    imgR1: TImage;
    imgR2: TImage;
    imgR3: TImage;
    imgUres: TImage;
    Label4: TLabel;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Image2: TImage;
    Bevel5: TBevel;
    Button1: TButton;
    procedure btnAllClick(Sender: TObject);
    procedure btnClearClick(Sender: TObject);
    procedure btnRunTestsClick(Sender: TObject);
    procedure btnBurnClick(Sender: TObject);
    procedure btnShowOtchetClick(Sender: TObject);
    procedure Sravn(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure cbxR1Change(Sender: TObject);
    procedure cbxWResChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure cbxR2Change(Sender: TObject);
    procedure cbxR3Change(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure saveResClick(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
   // procedure thread2;
    procedure Button1Click(Sender: TObject); //процедура второй ветви
    private
    answer:Integer;
    protected
  //  procedure thread2; //
  {private
    { Private declarations }
  {public
    { Public declarations }
  end;


var
  frmMain: TfrmMain;
  r1,r2,r3,r4,r5:integer;

implementation

uses Unit3, Unit2, Unit4, Unit5, Unit6, Unit7, Unit8, Unit9;


{$R *.dfm}

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?
а там, где хотим создать поток и сделать что либо по окончании его работы пишем:
Код:
uses НАЗВАНИЕ_НОВОГО_ЮНИТА;
...
fThread:=TFileThread.Create(False);
fThread.WaitFor();
...
end;

по моему все :)

_________________
forum.omskteam.ru- Все о керамограните


 

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;

type
  TFileThread = class(TThread)
  protected   
    procedure  Integral();
    procedure Execute; override;
  end;
implementation

uses
  SysUtils, Unit1;

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.

не люблю этот делфи, классы всякие, компонентики, а чтоб мозгой шевельнуть... :)
щас бы
Код:
hTh=CreateThread(...);
WaitForSingleObject(hTh);
CloseHandle(hTh);

ну вобщем вы меня поняли :)

_________________
forum.omskteam.ru- Все о керамограните


 

Member
Статус: Не в сети
Регистрация: 13.02.2004
Откуда: Вологда-Москва
написал пока только в type'е что надо и сразу ошибка на строчке
procedure Execute; override;
пишет типа method execute not found in base class...

вот код typ'a

type
TFileThread = class(TThread); //Íîâûé êëàññ
TfrmMain = class(TForm)
...тут много разных кнопок, шмопок и процедур...
protected
procedure Integral();
procedure Execute; override;
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- Все о керамограните


 

Member
Статус: Не в сети
Регистрация: 13.02.2004
Откуда: Вологда-Москва
TFileThread = class(TThread);

дак ведь так всё и есть. причем тут TForm?

Добавлено спустя 1 минуту, 27 секунд:
блин, дошло!!!
но возможно не всё...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 21 • Страница 1 из 21  2  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan