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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2010, 13:10   #1
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию Помогите подправить код Delphi 7 (работа с потоками)

В общем как запихать это в отдельный поток? (по таймеру приложение просто виснет)

Код:
procedure TForm1.vgloadTimer(Sender: TObject);
var
  bmp: TBitmap;
  Z1,j1,k1:extended;
begin
  bmp := TBitmap.Create;
  bmp.Width := 60;
  bmp.Height := 20;
  BitBlt(bmp.Canvas.Handle, 0,0, 60, 20, GetDC(form1.Handle), 320,540,SRCCOPY);
  Image.Width := 60;
  Image.Height := 20;
  Image.Picture.Assign(bmp);
  Threshold(Image.Picture.Bitmap, 140, clWhite, clBlack);
  bmp.Free;
  Z1:=CompareImageW(Image2,Image,60,20,0,0);
  j1:=CompareImageB(Image2,Image,60,20,0,0);
  k1:=(Z1+j1)/2;
  if k1 = 100 then
begin
vgload.Enabled:=false;
StatusBar1.SimpleText := 'загрузка приложения завершена';
 if vgpass.Checked=true then
    vglogin.Enabled:=true
  else
    begin
      play:=true;
      Tasks.Enabled:=true;
    end;
end;
Собственно ещё процедура использующаяся выше...
Код:
{для перевода картинки в чернобелый цвет}
procedure Threshold(Bitmap: TBitmap; Value: Byte; Color1, Color2: TColor);
type
  TRGB = record
    B, G, R: Byte;
  end;
  pRGB = ^TRGB;

  function ColorToRGB(Color: TColor): TRGB;
  begin
    with Result do
    begin
      R := Lo(Color);
      G := Lo(Color shr 8);
      B := Lo((Color shr 8) shr 8);
    end;
  end;
var
  x, y: Word;
  C1, C2: TRGB;
  Dest: pRGB;
begin
  Bitmap.PixelFormat := pf24Bit;
  C1 := ColorToRGB(Color1);
  C2 := ColorToRGB(Color2);
  for y := 0 to Bitmap.Height - 1 do
  begin
    Dest := Bitmap.ScanLine[y];
    for x := 0 to Bitmap.Width - 1 do
    begin
      //если среднеарифметическое R, G и B больше Value,
      //то точку (x, y) закрашиваем цветом Color1,
      //иначе - цветом Color2
      if (Dest^.r + Dest^.g + Dest^.b) / 3 > Value then
        Dest^ := C1
      else
        Dest^ := C2;
      Inc(Dest);
    end;
  end;
end;

Последний раз редактировалось stlcrash; 06.07.2010 в 16:01.
stlcrash вне форума Ответить с цитированием
Старый 06.07.2010, 13:22   #2
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Код:
Type
TMyThread=class(TThread)
protected 
procedure execute; override;
private
procedure work;
end;
.....
Procedure TMyThread.execute;
begin
while not terminated do
begin
synchronize(work);
end;
end;

procedure TMyThread.work;
begin
//ваш код
end;

//собственно ваш поток
Var
Th:TMyThread;
...
Th:=TMyThread.Create(true); //создаем приостановленным
Th.priority:=tpLowest; //приоритет (не помню как точно, но там можно выбрать из предложенного)
Th.resume; //продолжаем поток.
Самый простой способ. Есть синхронизация через критические секции, мьютексы и семафоры. Очень хорошо написано про потоки в статье, размещенной на сайте delphikingdom.
Также можно создавать потоки без описания класса:
Код:
BeginThread или CreateThread; //говорят лучше использовать первое
http://www.*************/readarticle.php?article_id=1998
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 06.07.2010 в 13:29.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 06.07.2010, 13:41   #3
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

А как сделать, что - бы поток выполнялся до определённого условия?
В моём случае это до полного совпадения 2х картинок..
stlcrash вне форума Ответить с цитированием
Старый 06.07.2010, 13:55   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты в своем условии просто поставь exit в том месте где нужно выйти из потока. По идее если у тебя все вращается в одной процедуре потока, по ее завершении завершается и сам поток.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.07.2010, 15:42   #5
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

Не выходит
Может я сюда выложу исходник и кто - нибудь подправит?
Всё что нужно, это сделать что - бы при нажатии на кнопку тест выполнялся цикл не через таймер, а отдельным потоком.
У меня получилось только .WAVки проигрывать потоком

PS delphi 7 использую.

Есть желающие помочь чутокс?

http://62.213.45.99/HELP/
Все файлы проекта (можно скачать сразу всё 1м архивом)

ЗЫ Нужно переделать процедуру кнопки <ТЕСТ>. Что - бы выполнялось не через таймер, а потоком.
Если кто сможет подправить програмку, сбросьте её сюды (кнопка загрузки в верхнем правом углу), или на depozit залейте хотяб, если не получится...

Последний раз редактировалось stlcrash; 06.07.2010 в 17:46.
stlcrash вне форума Ответить с цитированием
Старый 10.07.2016, 07:38   #6
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

Запускаю программу на 32битной win7 и 64 битной win7
Вопрос: почему в Win64 переменная NuPotock в 10 раз меньше(поток работает в 10 раз медленней получается)?
Почему скорость выполнения так сильно отличается?
Тестили на разных ПК. Результат не меняется.(разница в скорости примерно в 10 раз).

Пробовал компилировать на 64 винду 64 битный exe. Результат все тот же.
На 32 битной 130-150 раз в секунду.
на 64 битной 3-12 раз в секунду. (нужно поднять хотяб до 20)
PS на 64 битную винду даже убирал из цикла sleep(5); Но это не помогает поднять скорость работы потока хотяб до 20..

checkall;
inc(NuPotock);
//sleep(5);

Код:

//функция из ScreenScan:
function CheckPixel(x, y: integer; Color: string): boolean;
var s:string; DC: HDC; ColorValue: Cardinal;
begin
    DC := GetDC( 0 );
    ColorValue := GetPixel( DC, x, y);
    s:=intToStr(GetRValue( ColorValue ));
    s:=s+'.'+intToStr(GetGValue( ColorValue ));
    s:=s+'.'+intToStr(GetBValue( ColorValue ));
    ReleaseDC( 0, DC );
    result:= s=Color;
end;

Код потока:
unit uPotock;

interface

uses
  System.Classes;

  type
  TPix=(TPixTP,       //тп
    TPixHil,          //хил
    TPixBlink,        //блинк
    TPixMonster       //монстр в фокусе
    );

type
  Tpotock = class(TThread)
  private
    procedure checkall;
  public
    results:array[TPix] of boolean;
    hpbarX_TP,hpbarX_Hill,hpbarX_Blink,NuPotock:integer;

  protected
    procedure Execute; override;
  end;

var
  hpbarY,MonsterFoxusX,MonsterFoxusY:integer;
  HilColor,BlinkColor,TPColor,MonsterFoxusColor:string;

implementation
uses ScreenScan;

procedure tpotock.checkall;
begin
  results[TPixTP]:=CheckPixel(hpbarX_TP,hpbarY,TPColor);
  results[TPixHil]:=CheckPixel(hpbarX_Hill,hpbarY,HilColor);
  results[TPixBlink]:=CheckPixel(hpbarX_Blink, hpbarY,BlinkColor);
  results[TPixMonster]:=CheckPixel(MonsterFoxusX, MonsterFoxusY, MonsterFoxusColor);
end;

procedure tpotock.Execute;
begin
// + хил
  hpbarY:=725;
  HilColor:='46.46.46';
// + блинк
  BlinkColor:='46.46.46';
// + телепорт
  TPColor:='46.46.46';
// + рамка фокуса моба
  MonsterFoxusX:=640;
  MonsterFoxusY:=647;
  MonsterFoxusColor:='194.175.124';

  while not Terminated do
  begin
    checkall;
    inc(NuPotock);
    sleep(5);
  end;

end;

end.
stlcrash вне форума Ответить с цитированием
Старый 11.07.2016, 17:25   #7
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

Очень странно. для 64 разрядной операционной системы:
Вне потока код работает в раз 100 быстрей, чем в потоке.

В 32 разрядной системе и в потоке и вне потока работает одинакого.
Как ускорить для 64 битной системы, в запуская код в не в основном потоке?
stlcrash вне форума Ответить с цитированием
Старый 11.07.2016, 18:24   #8
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

Вы когда поток создаете - можно задать его приоритет:

Код:
MyThread.Priority:=tpLower;
Цитата:
tpIdle - Низший приоритет. Поток получает время только тогда, когда операционая система находится в состоянии простоя.
tpLowest - Приоритет на два пункта ниже нормального
tpLower - Приоритет на один пункт ниже нормального
tpNormal - Нормальный приоритет
tpHigher - Приоритет на один пункт выше нормального
tpHighest - Приоритет на два пункта выше нормального
tpTimeCritical - Максимальный приоритет. Приоритет на уровне функций ядра операционной
который будет влиять на выделение ему ресурсов, а следовательно - и скорость выполнения

p.s. хотя по умолчанию обычно приоритет нормальный, но поиграться стоит и с этим.
пишу код не только за печеньки

Последний раз редактировалось VIK_aka_TOR; 11.07.2016 в 18:26.
VIK_aka_TOR вне форума Ответить с цитированием
Старый 11.07.2016, 19:36   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Возьми программу и посмотри где тормозит.
API Monitor (rohitab.com)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросец про BDE и загрузку EXE Elementery Компоненты Delphi 3 12.06.2010 14:14
Вопросец по DLL Static Link >=VeNoM=< Общие вопросы C/C++ 5 08.10.2009 18:25