Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2010, 16:14   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Потоки

Приветствую всех форумчан. Тут на днях Stilet ответил на мой вопрос и предложил использовать потоки при написании приложений. Я решил поступить по-своему. Лег спать и не смог уснуть, хотя через большой промежуток времени заснул. Все это время мне не давала спать мысль "Как использовать потоки?" Сегодня пришел со школы и полез в Google. Он мне показал интересную статью. http://www.realcoding.net/article/view/101 . Вначале я понимал все, что делаю, но потом споткнулся об
Цитата:
Так а теперь вернемся к нашей возможной ошибки (Пункт1) и ты поймешь зачем мы создавали 2 «лишние» процедуры. Чтобы не возникало подобных ошибок(читай Пункт1) в классе Thread определен метод гарантированно-безопасного выполнения таких методов. Этот метод отвечает за синхронизацию всех потоков. И в качестве параметра получает только название метода. Вот именно для этого нам и понадобилось создавать 2 процедуры. Вот описание метода по синхронизации:

Type TThreadMethod= procedure of object;
Procedure Synchronize(Method : TThreadMethod);
.
Я не могу понять, куда это "впихивать". Естественно в раздел Type. Только не ясно в Форму или "пустой файл", как говорится в статье
Код:
TThreadMethod= procedure of object;
- Это множество вроде бы.
Код:
 Procedure Synchronize(Method : TThreadMethod);
-Это процедура.
Описанные выше строки для того, чтобы вы поправили меня, если я не так понимаю их значения.
Опишу весь вопрос. Куда вставлять вышеприведенные строки и правильно я ли я понимаю значение строк?
Заранее спасибо.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 24.09.2010, 16:24   #2
b2soft
Упртй программер
Форумчанин
 
Регистрация: 26.11.2009
Сообщений: 150
По умолчанию

Здравствуйте. Насколько я знаю - поток создается отдельным юнитом а не вписывается в форму, но если я вру - пусть более знающие поправят меня. А процедура Synchronize - отвечает за сихронизацию дополнительного потока и основной программы, тоесть например. Счетчик до миллиона - в отдельном потоке, а выводит данные в главное окно, тогда вызывается Synchronize чтобы сосинхронизировать потоки. Почитайте книгу М.Фленова "Библия Delphi", там есть оаздел потоки. Очень ясно и интересно написано как что и куда.
Помощь с кодом/лабами по С/С++
Контакты: ICQ 623334555 Skype: btwosoft; Mail: b2soft@yandex.ru
b2soft вне форума Ответить с цитированием
Старый 24.09.2010, 16:39   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Насколько я знаю - поток создается отдельным юнитом а не вписывается в форму, но если я вру - пусть более знающие поправят меня.
Поправляю. Поток может быть описан где угодно в любом модуле.
Например в модуле самой формы:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  t=class(TThread)
   procedure Execute; override;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var   tt:t;
  Form1: TForm1;

implementation

{$R *.dfm}

{ t }

procedure t.Execute;
begin
  while true do begin form1.Caption:=TimeToStr(time);sleep(100);end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  tt:=t.Create(false);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 tt.Terminate;
end;

end.
Я уж не говорю о Win API реализации

Или в отдельном модуле чтоб не загаживать модуль формы, этим занимается как раз мастер создания проекта в Делфи, предлагая модуль потока.

Цитата:
Это множество вроде бы.
нет. Это процедура, которая должна быть методом объекта.
Если описан тип procedure of object; то переменной (полю) этого типа может быть присвоен только метод класса (объекта).
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TThreadMethod= procedure of object;


  t=class(TThread)
   public
   pp:TThreadMethod;
   procedure Execute; override;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
   procedure ok;
    { Private declarations }
  public
    { Public declarations }
  end;

var   tt:t;
  Form1: TForm1;

implementation

{$R *.dfm}

{ t }

procedure t.Execute;
begin
  while true do begin if assigned(pp) then pp; sleep(100);end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  tt:=t.Create(true);
  tt.pp:=ok;
  tt.Resume;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 tt.Terminate;
end;

procedure TForm1.ok;
begin
   Caption:=TimeToStr(time);
end;

end.
Здесь ok - метод класса. Если бы я описал просто процедуру ок то ее невозможно было бы присвоить полю потока с именем pp, потому что ее тип "процедура обьекта"

Насчет Synchronize - создай мастером Делфи файл модуль потока там в комментах описан (должен быть) пример как ее пользовать
I'm learning to live...

Последний раз редактировалось Stilet; 24.09.2010 в 16:42.
Stilet вне форума Ответить с цитированием
Старый 24.09.2010, 17:17   #4
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Код:
while true do begin if assigned(pp) then pp
Что обозначает эта строка?
Цитата:
Насчет Synchronize - создай мастером Делфи файл модуль потока
Это вот так
Цитата:
Ну а теперь приступим к тому собственно из-за чего мы здесь собрались то есть к созданию потока. Кликай File->New->Thread Object.

В появившемся диалоговом окне названия класса укажем TMyThread. Этот класс будет наследником класса потока TThread. После это возникает файл с пустым описанием этого класса.
?
И там в коментариях посмотреть?
Цитата:
Почитайте книгу М.Фленова "Библия Delphi", там есть раздел потоки.
Я читал (Правда первое издание), там он говорит, что позже с Вами разберем принцип их работы.
Добавил 17,24
Создал юнит и там вот такое
Код:
{Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure TMyThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end;}
Это оно? Что-то я перевода не пойму
P.S. уже раз 8 редактировал.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 24.09.2010 в 17:29.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 24.09.2010, 19:37   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Код:
Type TThreadMethod= procedure of object;
 Procedure Synchronize(Method : TThreadMethod);
Это вообще вводить нужно? Или код который приведен, объясняет построение класса Thread? Как объявлять и что? Я что-то недопонял.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 25.09.2010, 12:06   #6
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

А ты проверь. Например рисуй что нибудь на форме из потока. Сначала просто (заработает, но тормознет со временем) и с помощью синхронизации (будет все красиво)

Буду дома - кину примерчик где очень наглядно видно разницу и принципы.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 25.09.2010, 15:38   #7
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Например рисуй что нибудь на форме из потока
Вот меня это и интересует. Как рисовать или выполнять другие действия из потока? Я оформить код не могу.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 26.09.2010, 13:00   #8
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Так. Как выполнять действия из потока я понял, а как, создав отдельный Unit, Синхронизировать методом Synchronize непойму.
Создаю Unit и процедуру под именем f
Код:
  Tnew = class(TThread)
  procedure f;
  private
...
procedure Tnew.f;
begin
Form1.Caption:='Привет!. Я поток из Unit2';
end;
.
Потом пытаюсь выполнить действия
Код:
procedure Tnew.Execute;
begin
  { Place thread code here }
Synchronize(f);
end;
Delphi пишет, что не знает Form1

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 26.09.2010, 15:44   #9
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

так модуль другой. Припиши uses Unit1;
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 26.09.2010, 19:27   #10
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Сообщение от Gambler Посмотреть сообщение
так модуль другой. Припиши uses Unit1;
Я прописал в implementation. Спасибо

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
потоки tanek Помощь студентам 6 15.03.2010 21:42
потоки Владимир1988 Помощь студентам 0 08.02.2010 23:12
Потоки в С++ BioS Общие вопросы C/C++ 2 09.01.2010 21:34