Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Общие вопросы > Поток не стартует


Автор: faust777 25.09.20, 10:27
Что с этим можно сделать?

Есть поток
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      TUPD = class(TThread)
      private
        FAK: Integer;
      protected
        procedure Execute; override;
      public
        constructor Create(TH: Integer);
      end;
     
     
    .........
     
     
    constructor TUPD.Create(TH: Integer);
    begin
      FAK:= TH;
      inherited Create(False);
      FreeOnTerminate:= True;
    end;
     
    procedure TUPD.Execute;
    begin
    ..
    end;


Всё как бы работает.
Но если подвесить форму, например так то поток не запускается (в Execute ни чего не происходит) пока "зависание" не пройдёт.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    for j := 0 to 9 do begin
      Sleep(1000);
     end;

Автор: Gonarh 25.09.20, 10:41
http://docs.embarcadero.com/products/rad_s...readMethod.html

Добавлено
И это, я надеюсь "подвисание" ты вызываешь после старта потока?

Автор: faust777 25.09.20, 11:04
Какая разница когда, это имитация, программу в любой момент может какая либо процедура повесить в этом проблема.
И причём тут синхронизация если главный поток ни чего не делает?

Автор: VisualProg 25.09.20, 11:13
Цитата faust777 @
Какая разница когд

Например - большая. Управляющий поток висит, кто твой второй поток запускать будет?

Автор: faust777 25.09.20, 12:20
Не понимаю, кто что где должен запускать?

Куда уж напримерней(
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        for j := 0 to 9 do begin
          TUPD.Create(j);
          Sleep(1000);
        end;


Цикл идёт, идёт. Конструктор потоков запускаются, да.
Но сами потоки то не работают, вопрос почему и что можно сделать?
Цикл закончится и форма отвиснет то во всех главных procedure TUPD.Execute; всё отработает как нужно.

Автор: ЫукпШ 29.09.20, 10:34
Цитата faust777 @
Цикл идёт, идёт. Конструктор потоков запускаются, да.
Но сами потоки то не работают, вопрос почему и что можно сделать?

Каким способом ты узнал, что потоки не запускаются ?

Автор: Gonarh 29.09.20, 10:58
Цитата faust777 @
Цикл идёт, идёт. Конструктор потоков запускаются, да.
Но сами потоки то не работают, вопрос почему и что можно сделать?

Работают, просто у тебя майнтред не обрабатывает мессаджи.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        for j := 0 to 9 do begin
          TUPD.Create(j);
          Sleep(1000);
          Application.ProcessMessages;
        end;


Добавлено
Цитата faust777 @
Какая разница когда

Большая разница

Добавлено
Цитата ЫукпШ @
Каким способом ты узнал, что потоки не запускаются ?

Вангую, он думает что раз майнтред висит и одупляется после цикла, то и треды тоже стартуют после.

Автор: Mr.Delphist 30.09.20, 07:50
Цитата faust777 @
procedure TUPD.Execute;
begin
..
end;


А что в самом теле Execute?

Автор: ЫукпШ 30.09.20, 11:15
Цитата Mr.Delphist @
А что в самом теле Execute?

А это практически не важно.
1. запускаем утилиту DbgView
2. Модифицируем своё приложение приблизительно так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    procedure TUPD.Execute;
    begin
     
    OutputdebugString('name begin');
    ..
     
     
    OutputdebugString('name end');
    end;
     
    ...
    ...
     
    OutputdebugString('Create begin');
            for j := 0 to 9 do begin
              TUPD.Create(j);
              Sleep(1000);
              Application.ProcessMessages;
            end;
    OutputdebugString('Create end');
     
    ...

Разным потокам присвоим разные имена.
Или будем различать их каким-либо иным способом.
---
Приложение собираем, запускаем, завершаем.
И в результате в окошке внешнего приложения видим
последовательность происходящих событий в реальном времени.

Автор: jack128 30.09.20, 19:18
Цитата ЫукпШ @
1. запускаем утилиту DbgView

это лишнее, дельфевый отладчик показывает выхлоп от OutputdebugString

Автор: ЫукпШ 30.09.20, 19:49
Цитата jack128 @
Цитата ЫукпШ @
1. запускаем утилиту DbgView

это лишнее, дельфевый отладчик показывает выхлоп от OutputdebugString

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

Автор: jack128 30.09.20, 20:33
Цитата ЫукпШ @
Допустим, что мы наблюдаем за поведением приложения в период опытной эксплуатации,
в том числе и там, где Дельфи не установлена

Допустим мы наблюдаем за поведением приложения на Альфа Центавре, и у нас нету возможности поставить туда DbgView?
ТопикСтартер говорит, что поведение воспроизводимо, значит и под дельфей сможет отладить. ставить сторонний софт из-за каждого бага - хреновый совет

Автор: ЫукпШ 01.10.20, 11:10
Цитата jack128 @
ставить сторонний софт из-за каждого бага - хреновый совет

Это не сторонний софт, а необходимый инструмент. И ставить его не нужно, установки
не требует.
А вот ставить дельфи где попало не нужно и просто не возможно.
Как поставить дельфи в виртуальной машине ? С целью проверить, как
как будет работать приложение по разными ОС.

Добавлено
Цитата jack128 @
Допустим мы наблюдаем за поведением приложения на Альфа Центавре, и у нас нету возможности поставить туда DbgView?

я это не пробовал, но она может работать и через сеть.
---
Гораздо умнее можно было бы возразить - а как работать
с DbgView, если захочется отлаживать службу для WIN10 ?

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)