Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.02.2011, 15:53
Аватар для eXplorer
eXplorer eXplorer вне форума
Активный
 
Регистрация: 06.08.2010
Адрес: Ярославль
Сообщения: 264
Версия Delphi: 7
Репутация: 14
По умолчанию TCriticalSection

Всем добрый день! начал изучать работу с потоками... и сталкнулся с такой проблемой... (создаю например 5 потоков), что бы какую то часть кода выполнял только один поток, а все остальные ожидали окончания выполнения этого кода как я понял используется "TCriticalSection" и его методы Enter и Leave... написал вот такой код для процедуры Execute:

Код:
procedure TMyThread.Execute;
var
i:integer;
cs:TCriticalSection;
begin
for i:=0 to 10000 do begin
cs.Enter;
s:='2*'+inttostr(i)+'='+inttostr(i*2);
cs.Leave;
Synchronize(show);
end;
end;

выдаёт сообщение:
"Debugger Exception Notification"
в чём ошибка? помогите пожалуйста!
__________________
Ответить с цитированием
  #2  
Старый 19.02.2011, 16:21
Аватар для eXplorer
eXplorer eXplorer вне форума
Активный
 
Регистрация: 06.08.2010
Адрес: Ярославль
Сообщения: 264
Версия Delphi: 7
Репутация: 14
По умолчанию

извени те пожалуйста... проблема решилась... забыл написать:
Код:
CS:=TCriticalSection.Create;
проблема в другом... это не решает всю ситуацию... всё равно каждый поток выводит строку и получается:

Цитата:
2*0=0
2*0=0
2*0=0
2*0=0
2*0=0
2*1=2
2*1=2
2*1=2
2*1=2
2*1=2
2*2=4
... и т.д.

как сделать так?
Цитата:
2*0=0
2*1=2
2*2=4
...
и т.д.

помогите пожалуйста(
__________________
Ответить с цитированием
  #3  
Старый 19.02.2011, 16:27
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

TCriticalSection должна быть глобальной:
Код:
unit Unit1;

interface

uses
  SyncObjs,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls;

type
  TMyThread = class(TThread)
  private
    procedure Avatar;
  protected
    procedure Execute; override;
  public
    i: Integer;
    constructor Create;
  end;

  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  cs: TCriticalSection;

implementation

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Avatar;
begin
  Form1.Memo1.Lines.Add(IntToStr(i));
end;

constructor TMyThread.Create;
begin
  inherited Create(True);
  FreeOnTerminate:=True;
end;

procedure TMyThread.Execute;
begin
  cs.Acquire;
  try
    Sleep(i);
  finally
    cs.Release;
  end;
  Synchronize(Avatar);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TMyThread.Create do
  begin
    i:=2000;
    Resume;
    Sleep(100);
  end;
  with TMyThread.Create do
  begin
    i:=1000;
    Resume;
    Sleep(100);
  end;
  with TMyThread.Create do
  begin
    i:=500;
    Resume;
    Sleep(100);
  end;
end;

initialization
  cs:=TCriticalSection.Create;

finalization
  cs.Free;

end.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 19.02.2011, 21:42
Аватар для eXplorer
eXplorer eXplorer вне форума
Активный
 
Регистрация: 06.08.2010
Адрес: Ярославль
Сообщения: 264
Версия Delphi: 7
Репутация: 14
По умолчанию

Это понял... спасибо...
извеняюсь за колличество вопросов в одной теме...

Код:
procedure TMyThread.Execute;
var
i2:integer;
begin
for i2:=1 to 10000 do begin
cs.enter;
  S:=inttostr(i2);
cs.leave;
  Synchronize(Avatar);
end;
end;
почему этот код выполняют все 5 потоков одновременно? если стоит CriticalSection... или я делаю что не так.... или я туплю
__________________
Ответить с цитированием
  #5  
Старый 19.02.2011, 21:50
Аватар для eXplorer
eXplorer eXplorer вне форума
Активный
 
Регистрация: 06.08.2010
Адрес: Ярославль
Сообщения: 264
Версия Delphi: 7
Репутация: 14
По умолчанию

дурак я... прошу прощения за за этот флуд...
разобрался:

Код:
procedure TMyThread.Execute;
var
i2:integer;
begin
for i2:=1 to 10000 do begin
 cs.enter;
  S:=inttostr(i2);
  Synchronize(Avatar);
end;
  cs.leave;
end;
тему можно закрывать)
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:54.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025