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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2016, 13:42   #1
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 132
По умолчанию Поток приостанавливается на 1-2 сек

Если создаю поток по таймеру, каждые 50мс, то хоть как то работает.
Но если создаю бесконечный поток while do begin sleep(50); chekTp; end; А не таймером, то он постоянно приостанавливается. Хотя у него приоритет выше среднего. Вопрос как поправить, чтоб данный поток промерял цвет пикселя каждые 50мс и не приостанавливался переодически на 1 - 2 сек.

Код:
var
  MyThread: TMyThread;

.....

private
  procedure ChekTP();

.....

    TMyThread = class(TThread)
    private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure ChekTp;
  end;


//поток 1
procedure TMyThread.ChekTp;begin Form1.ChekTP; end;
procedure TMyThread.Execute; begin Synchronize(ChekTp); end;

//запускаем поток
procedure TForm1.TPHOMETimer(Sender: TObject);
begin
  MyThread:=TMyThread.Create(false);
  MyThread.Priority:= tpHigher; //tpNormal;//
  MyThread.FreeOnTerminate:=true;
end;

procedure TForm1.ChekTP;
var
  DC: HDC;
  ColorValue: Cardinal;
  s:string;
  nextStep,addLinesFind:boolean;
  i:integer;
begin
ChekTPColvo.Value:=ChekTPColvo.Value+1;
nextStep:=true;
addLinesFind:=true;
DC := GetDC( 0 );
if TPCheckBox.Checked then
      begin
      ColorValue := GetPixel( DC, TPX,TPY  );
      //тп домой если мало ХП
      s:=intToStr(GetRValue( ColorValue ));
      s:=s+'.'+intToStr(GetGValue( ColorValue ));
      s:=s+'.'+intToStr(GetBValue( ColorValue ));
      if s=TPColor then
        begin
          nextStep:=false;
          tpWar;
       end else if not MouseUnBlock.Checked then MouseUnBlock.Checked:=true;
      end;
      //модуль подбора вещей
     if nextStep then begin
        ColorValue := GetPixel( DC,MonsterFoxusX,MonsterFoxusY  );
        s:=intToStr(GetRValue( ColorValue ));
        s:=s+'.'+intToStr(GetGValue( ColorValue ));
        s:=s+'.'+intToStr(GetBValue( ColorValue ));
        if s=MonsterFoxusColor then
          begin
           if not FocysMonster.Checked then FocysMonster.Checked:=true;
          end else
          begin
            if FocysMonster.Checked then
            begin
              if Epress.Checked then Task.Lines.Add('поднять');
              FocysMonster.Checked:=false;
              MonsterColvo.Caption:=IntToStr(StrToInt(MonsterColvo.Caption)+1);
              for i:=0 to Task.Lines.Count-1 do
              begin
                if Task.Lines[i]='поиск монстров' then addLinesFind:=false;
              end;
              if (Boting.Checked) and (addLinesFind) then Task.Lines.Add('поиск монстров');
            end;
          end;
	    end;
  ReleaseDC( 0, DC );
end;
stlcrash вне форума Ответить с цитированием
Старый 13.04.2016, 14:22   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Винда сама регулирует приоритет потоков. Так что если ей будет нужно, то хоть какой приоритет не ставь своему потоку, винда всё равно сделает по своему.
FaTaL вне форума Ответить с цитированием
Старый 13.04.2016, 14:43   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

кто тебя надоумил такую хрень написать?
тут же нет никакой многопоточности!

тебе надо сделать простой поток, генерирующий синхронное событие каждые N мс, и всё! хотя, чем тебя таймер не устраивает?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 13.04.2016, 15:01   #4
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 132
По умолчанию

Не устраивает тем, что таймер во время сравнения изображений ничего не делает и тупо висит по 1-2 сек.
stlcrash вне форума Ответить с цитированием
Старый 13.04.2016, 15:13   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Не устраивает тем, что таймер во время сравнения изображений ничего не делает и тупо висит по 1-2 сек.
Как звучит задание в оригинале?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 13.04.2016, 15:18   #6
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Да, это не только отсутствие многопоточности, но и много другое

Synchronize(ChekTp); - это убивает всю параллельность, синхронизировать весь поток абсолютно бессмысленно

TMyThread.ChekTp;begin Form1.ChekTP; end; - это делать очень опасно, нельзя обращаться к компонентам без синхронизации. Эм... хотя нет, всё нормально, ведь весь поток синхронизирован с главным потоком

Приоритет потоков в данном случае не работает хотя бы из-за того, что всё выполняется в главном потоке. Короче, приоритеты вообще ни к месту

Синхронизировали-синхронизировали, да пересинхронизировали
eoln вне форума Ответить с цитированием
Старый 13.04.2016, 18:21   #7
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 132
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Как звучит задание в оригинале?
Задача звучит так:
Необходимо раз в 0.05 секунд проверять цвет пикселя. Если он изменится, выполнять заданную процедуру и останавливать все остальные процедуры которые в это время происходят.
stlcrash вне форума Ответить с цитированием
Старый 13.04.2016, 18:28   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

del

50 мс отмерять с какой точностью надо?
Можно вообще отказаться от таких интервалов и в побочном потоке мониторить условие через WaitForSingleObject()...

Откуда тред должен каждые 50 мс считывать значение цвета пикселя? Это важно знать. Если это какой-то канвас, который меняется в основном потоке, то его надо будет лочить 20 раз в секунду или использовать критическую секцию, для синхронизации. Фигня получится.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 13.04.2016 в 18:46.
min@y™ вне форума Ответить с цитированием
Старый 13.04.2016, 19:00   #9
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 132
По умолчанию

Точность не критична вообще. главное чтоб небыло "пауз" в секунду. Цвет пикселя берется с экрана(из игры) с полоски жизней.
stlcrash вне форума Ответить с цитированием
Старый 13.04.2016, 19:02   #10
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 132
По умолчанию

Точность не критична. Даже если будет разброс в 50-100мс. Главное чтоб пауз небыло в секунду. Цвет пикселя берется с экрана из игры. (полоска жизней)
stlcrash вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
зависает комп на 10 сек каждые 50 сек(примерно) ололошенько Помощь студентам 0 17.09.2013 23:03
Программа блокировки клавиатуры на 15 сек Vikctor Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 29.11.2010 12:10
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
Как округлить милисекунды в кол-во сек и мили сек? XerSon Общие вопросы Delphi 2 09.06.2010 10:26