Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с потоками / 8 сообщений из 8, страница 1 из 1
20.11.2003, 10:26
    #32329722
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с потоками
Я создаю потоки вот так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
var
    th1:cardinal;
    h1:integer;
    pr:TThreadAttr;

procedure Build;
begin
  pr.__schedparam.sched_priority:= 4 ;
  h1:=beginthread(@pr, 1024 ,@incedit1,nil, 0 ,th1);
end;

procedure incedit1;
begin
....
{чего то делаю}
....
  terminatethread(h1, 0 );
end;


Все нормально работает пока программа не пытается создать уже созданный поток (то есть предыдущий еще не отработал). Программа просто вываливается с OSError. Подскажите как можно это побороть попроще.
Как выход сделал семафор (мьютекс, флаг кому как нравится) что процесс занят, но процедура тогда пропускается просто... это не выход

Viman
...
Рейтинг: 0 / 0
20.11.2003, 11:00
    #32329769
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с потоками
наверное, когда выполняется terminatethread(h1,0); в переменной h1 лежит уже новое значение. от этого нужно избавиться имхо.
...
Рейтинг: 0 / 0
20.11.2003, 11:03
    #32329773
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с потоками
Мне тоже это первое в голово пришло, но как избавится (без диких нагромождений кода) я не знаю...

Viman
...
Рейтинг: 0 / 0
20.11.2003, 11:05
    #32329775
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с потоками
А чем стандартные методы не нравятся?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
   TAnyRunThread = Class(TThread)
     private
       vProc  : TNotifyEvent;
       xParam : TObject;
       property EventProc : TNotifyEvent read vProc write vProc;
     protected
       procedure Execute; override;
     public
       constructor Create(pProc : TNotifyEvent; Sender : TObject);
     end;

procedure TAnyRunThread.Execute;
begin
  if not Assigned(vProc) then Exit;
  try
     EventProc(xParam);
  finally
     Destroy;
  end
end;

constructor TAnyRunThread.Create(pProc : TNotifyEvent; Sender : TObject);
begin
   vProc:= pProc; xParam:= Sender;
   FreeOnTerminate:= True;
   inherited Create(False)
end;

procedure TFMainForm.doSomething(Sender : TObject);
begin
   // что-то делаю
end;

....
   TAnyRunThread.Create(doSomething, Sender);
....
...
Рейтинг: 0 / 0
20.11.2003, 11:20
    #32329798
Александр Спелицин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с потоками
Вы создаете поток, а внутри него пытаетесь его же и уничтожить через TerminateThread. Сразу ДВЕ ошибки в одном слове!!!
Если Вам нужно завершить поток из его же кода, то вызывайте ExitThread().
Если же нужно узнать, завершился ли поток или нет, то это делается через
Код: plaintext
WaitForSingleObject (hThread,  0 )

где hThread - это хэндл потока (возвращается при вызове CreateThread)
Если результат WAIT_OBJECT_0, то поток завершился
Если WAIT_TIMEOUT, то поток продолжает работать.
...
Рейтинг: 0 / 0
20.11.2003, 11:34
    #32329819
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с потоками
2Александр Спелицин
Возможно это и ошибка, но потоков у меня 3 и по одному (разные вместе работают, один и тот же два раза не создается) они отрабатывают прекрасно. Попробую через ExitThread().

2 Luchkin Dmitry
Я знаю про стандартные методы, правда создавал предельно просто
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 TTreeThread = class(TThread)
  private
  protected
    procedure Execute; override;
  public
    constructor Create();
  end;

Но почему то когда в программе начинаешь выполнять какие либо действия (окна открывать, в меню мышкой водить), то поток приостанавливается (не тормозит, а именно останавливается). Я не стал разбираться с этим, это все вещи второстепенные, сделал другим методом - работает и ладно.

Viman
...
Рейтинг: 0 / 0
20.11.2003, 11:43
    #32329843
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с потоками
>...приостанавливается (не тормозит, а именно останавливается)...
не замечал.
Удачи! ;-)
...
Рейтинг: 0 / 0
20.11.2003, 11:56
    #32329871
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с потоками
2Luchkin Dmitry
Давно делал математический расчет долгий, считалось все в потоке, форма стандартная, потом еще одна программа тоже с стандартной формой, 2 потока, ничего не останавливалось. Сейчас mdi приложение, компонент много дополнительных.... изза чего такой баг понятия не имею и тратить время чтобы с этим разбираться нехочется...

Viman
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с потоками / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]