Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 02.09.2015
Сообщений: 76

Потоки

06.05.2016, 12:05. Показов 2298. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, я тут с потоками чуток поэкспериментировал... Изучаю их. Почему у меня программа, вот с этим кодом, виснет через минуту, после запуска?
Кликните здесь для просмотра всего текста
Pascal
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
type
  Potok_1 = Class (TThread)
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Execute; Override;
  end;
 
type
  Potok_2 = Class (TThread)
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Execute; Override;
  end;
 
var
  Form1: TForm1;
  MeThred_1: Potok_1;
  MeThred_2: Potok_2;
  Potoki: Boolean;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Button2.Enabled:= False;
end;
 
procedure Potok_1.Execute;
var bmp:TBitmap;
begin
  while Potoki do
  begin
    bmp := TBitmap.Create;
    bmp.Width := 200; // Ширина скрина
    bmp.Height := 33; // Высота скрина
    BitBlt(bmp.Canvas.Handle, 0,0, Screen.Width, Screen.Height,
    GetDC(0), 573,103,SRCCOPY); // 573,103 - Координата скрина
    Form1.Image1.Width := bmp.Width;
    Form1.Image1.Height := bmp.Height;
    Form1.Image1.Picture.Assign(bmp);
    bmp.Free;
    Sleep (55)
  end;
end;
 
procedure Potok_2.Execute;
var bmp:TBitmap;
begin
  while Potoki do
  begin
    bmp := TBitmap.Create;
    bmp.Width := 370; // Ширина скрина
    bmp.Height := 53; // Высота скрина
    BitBlt(bmp.Canvas.Handle, 0,0, Screen.Width, Screen.Height,
    GetDC(0), 535,387,SRCCOPY); // 535,387 - Координата скрина
    Form1.Image2.Width := bmp.Width;
    Form1.Image2.Height := bmp.Height;
    Form1.Image2.Picture.Assign(bmp);
    bmp.Free;
    Sleep (55)
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Potoki := True;
 
  MeThred_1 := Potok_1.Create(True); // Создаем экземпляр класса потока
  MeThred_1.FreeOnTerminate:=True; // После выполнения потока, автоматически из него выйдет и убьет его.
  MeThred_1.Priority:=tpLower; // Приаритет потока
  MeThred_1.Resume;
 
  MeThred_2 := Potok_2.Create(True); // Создаем экземпляр класса потока
  MeThred_2.FreeOnTerminate:=True; // После выполнения потока, автоматически из него выйдет и убьет его.
  MeThred_2.Priority:=tpLower; // Приаритет потока
  MeThred_2.Resume;
 
  Button1.Enabled:= False;
  Button2.Enabled:= True;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Potoki := False;
  Button1.Enabled:= True;
  Button2.Enabled:= False;
  Form1.Image1.Picture := nil;
  Form1.Image2.Picture := nil;
end;
 
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.05.2016, 12:05
Ответы с готовыми решениями:

потоки
помогите разобраться, как лучше сделать. добавляю в мемо строки, после того как добавится 10к строк, добавляю в Orascript и делаю execute в...

Потоки
Приветствую вас друзья. Возникла проблема с потоками. При у компилятора вопросов не возникает но при работе программы получается ошибка ...

Потоки
for pot:=1 to StringGrid1.RowCount do a:=potok.Create(false); этой строчкой создаю потоки, как сделать так, чтобы поток с...

43
0 / 0 / 0
Регистрация: 02.09.2015
Сообщений: 76
06.05.2016, 17:17  [ТС]
Студворк — интернет-сервис помощи студентам
krapotkin, ну, разбираюсь пока... Инфы накидали вы тут все же - благодарю. Как по всей этой инфе приду в тупик, вернусь сюда ) Ну, или если решу проблему. В таком случае выложу код тут. А то у этого форума проблема есть... Лазаю тут по темам... Чел проблему описывает и код показывает - ему умными словами объясняют и он уходит. А как в итоге он все же все сделал... - Так никто и не узнал и я в том числе.

Добавлено через 50 минут
http://www.delphi-manual.ru/synchronize.php
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TMyThread.UpdateCaption;
begin
while True do
  begin
    Form1.Caption:=IntToStr(I);//I - глобальная переменная основной программы, индекс массива
    sleep(100);
  end;
end;
 
procedure TMyThread.Execute;
begin
  Synchronize(UpdateCaption);
end;
Видим, что происходит именно то, о чём написано выше. Так как весь код потока, и модификация заголовка Формы, и цикл ожидания, выполняется в методе Synchronize, а значит в главном потоке, то приложение будет выглядеть зависшим, и его даже будет невозможно корректно завершить.
Теперь попробуем вывести цикл за пределы Synchronize:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TMyThread.UpdateCaption;
begin
  Form1.Caption:=IntToStr(Cap);
end;
 
procedure TMyThread.Execute;
begin
while True do
  begin
    Synchronize(UpdateCaption);
    sleep(100);
  end;
end;
Это правильный вариант. С помощью метода Synchronize выполняется только непосредственная модификация Заголовка Формы, а цикл ожидания выполняется в потоке, и не мешает главному потоку.

Я вот намутил вроде все, как сказано... Но у меня все равно прога просто виснет при клике на кнопку...
Кликните здесь для просмотра всего текста
Delphi
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SyncObjs;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TMyThread = class(TThread)
    private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure UpdateCaption;
  end;
 
var
  Form1: TForm1;
  MyThread: TMyThread;
  I: Integer;
 
implementation
 
{$R *.dfm}
 
procedure TMyThread.UpdateCaption;
begin
  while True do
  begin
    Form1.Edit1.Text:=IntToStr(I);//I - глобальная переменная основной программы, индекс массива
  end;
end;
 
procedure TMyThread.Execute;
begin
  while True do
  begin
    Synchronize(UpdateCaption);
    sleep(100);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  MyThread:=TMyThread.Create(False);
  MyThread.Priority:=tpNormal;
  MyThread.FreeOnTerminate:=true;
end;
 
end.


Добавлено через 19 минут
Заработала! )))
Кликните здесь для просмотра всего текста
Delphi
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SyncObjs;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TMyThread = class(TThread)
    private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure UpdateCaption;
  end;
 
var
  Form1: TForm1;
  MyThread: TMyThread;
  I: Integer;
 
implementation
 
{$R *.dfm}
 
procedure TMyThread.UpdateCaption;
begin
  Form1.Edit1.Text:=IntToStr(I);
end;
 
procedure TMyThread.Execute;
begin
while True do
  begin
    Synchronize(UpdateCaption);
    I := I + 1;
    sleep(100);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  I := 1;
  MyThread:=TMyThread.Create(False);
  MyThread.Priority:=tpNormal;
  MyThread.FreeOnTerminate:=true;
end;
 
end.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
06.05.2016, 17:44
да, тут все верно, но это плохая практика - использовать глобальную переменную Form
а еще бесконечный цикл в потоке обычно только в серверах используется
и реально тут поток ничего не делает, все то же самое сделал бы обычный таймер.

правильнее было бы
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TMyThread=class(TThread)
...
  e:TEdit;
end;
 
procedure TForm1.b1Click(...);
begin
th:=TMyThread.Create(true);
th.e:=Edit;
...
th.start;
end;
 
procedure TMyThread.UpdateCaption;
begin
  E.Text:=IntToStr(I);
end;
1
0 / 0 / 0
Регистрация: 02.09.2015
Сообщений: 76
06.05.2016, 18:01  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
все то же самое сделал бы обычный таймер
Да я согласен с этим. Но я лишь примеры привел. Просто потом в итоге мне нужно, чтобы в Image1 Экран сканировался постоянно и вот это в таймер поместить можно, а вот в Image2 экран начнет сканироваться только тогда, когда в Image1 будут соблюдены условия (найдутся нужные пиксели). Далее пойдет расшифровка капчи в Image2 (это я уже реализовал), потом определенные действия и потом пауза секунд в 5. Вот мне нужно, чтоб при этой паузе вся прога не висла.

Добавлено через 3 минуты
Цитата Сообщение от krapotkin Посмотреть сообщение
TMyThread=class(TThread)
...
e:TEdit;
end;
TEdit или TEdit1?

Добавлено через 3 минуты
Цитата Сообщение от Hito Посмотреть сообщение
Далее пойдет расшифровка капчи
Только не думайте, что я спамер какой-нибудь леплю - это не мое. В игре мне просто трудно капчу одну набирать самому, а рыбку ловить хочется...))

Добавлено через 2 минуты
Цитата Сообщение от Hito Посмотреть сообщение
TEdit или TEdit1?
Понял. В строке 9 Edit1...
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
06.05.2016, 18:03
все, что касается экрана и работы с пользователем - все всегда в главный поток
все, что касается обработки данных, связи с сервером, подключения к БД - все в отдельный поток
0
0 / 0 / 0
Регистрация: 02.09.2015
Сообщений: 76
06.05.2016, 18:10  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
все, что касается экрана и работы с пользователем - все всегда в главный поток
все, что касается обработки данных, связи с сервером, подключения к БД - все в отдельный поток
Ок... Давайте так... Например... Мне нужно, чтобы в Image1 часть экрана сканировалась постоянно, пока работает прога. В Image2 попадает часть экрана, только при соблюдении условий в Image1, и фиксируется там до тех пор, пока не пройдет анализ, действия и пауза, а в Image1 продолжает сканироваться экран. Как это сделать? Если в таймер запихнуть все это, то в момент, когда будет анализироваться Image2, осуществляться действия и проходить пауза, и в Image1 скан прекратиться. И вообще во время паузы вся прога повиснет...
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
06.05.2016, 18:18
простой таймер сканирует экран
анализ выполняется в потоке и ничего не тормозит
в image ничего грузить не нужно, нужно создавать TBitmap

в моей "заметке" написано, что событие OnTerminate производится уже в главном потоке, при этом объект потока еще содержит все нужные данные. поэтому все, что поток проанализировал, там будет доступно

Добавлено через 27 секунд
никакой паузы нет, таймер сам срабатывает когда нужно
0
0 / 0 / 0
Регистрация: 02.09.2015
Сообщений: 76
06.05.2016, 18:20  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
простой таймер сканирует экран
анализ выполняется в потоке и ничего не тормозит
в image ничего грузить не нужно, нужно создавать TBitmap
в моей "заметке" написано, что событие OnTerminate производится уже в главном потоке, при этом объект потока еще содержит все нужные данные. поэтому все, что поток проанализировал, там будет доступно
Вы забыли про паузу, которая мне НУЖНА.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
06.05.2016, 18:23
таймер сам себе пауза, что еще нужно?
0
0 / 0 / 0
Регистрация: 02.09.2015
Сообщений: 76
06.05.2016, 20:13  [ТС]
Странная херь... У меня программа запускается и виснет через 5 минут, с кодом, в котором вообще ни одного потока нет...:
Кликните здесь для просмотра всего текста
Delphi
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SyncObjs, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Image2: TImage;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  bmp1,bmp2:TBitmap;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Button2.Enabled:= False;
  Timer1.Enabled:=False;
  Timer2.Enabled:=False;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled:=True;
  Timer2.Enabled:=True;
  Button1.Enabled:= False;
  Button2.Enabled:= True;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer1.Enabled:=False;
  Timer2.Enabled:=False;
  Button1.Enabled:= True;
  Button2.Enabled:= False;
  Image1.Picture := nil;
  Image2.Picture := nil;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  bmp1 := TBitmap.Create;
  bmp1.Width := 200; // Ширина скрина
  bmp1.Height := 33; // Высота скрина
  BitBlt(bmp1.Canvas.Handle, 0,0, Screen.Width, Screen.Height,
  GetDC(0), 573,103,SRCCOPY); // 573,103 - Координата скрина
  Form1.Image1.Width := bmp1.Width;
  Form1.Image1.Height := bmp1.Height;
  Form1.Image1.Picture.Assign(bmp1);
  bmp1.Free;
end;
 
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  bmp2 := TBitmap.Create;
  bmp2.Width := 370; // Ширина скрина
  bmp2.Height := 53; // Высота скрина
  BitBlt(bmp2.Canvas.Handle, 0,0, Screen.Width, Screen.Height,
  GetDC(0), 535,387,SRCCOPY); // 535,387 - Координата скрина
  Form1.Image2.Width := bmp2.Width;
  Form1.Image2.Height := bmp2.Height;
  Form1.Image2.Picture.Assign(bmp2);
  bmp2.Free;
end;
 
end.

При чем проходит характерный такой сигнал, когда ошибка какая-нибудь вылазит, но ошибки самой никакой не показывает... Уж в этом-то коде что может быть такого...?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
06.05.2016, 21:00
Цитата Сообщение от Hito Посмотреть сообщение
Странная херь
Что ж странного в "хери" ?
Таймер у тебя фигачит в темпе ошпареного кота, всякий раз когда он тикает ты запрашиваешь у ОС ресурс (GetDC), а взад не возвращаешь (ReleaseDC)
И второй таймер, который вообще не нужен, у тебя занят той же чудесной "херью")
1
0 / 0 / 0
Регистрация: 02.09.2015
Сообщений: 76
06.05.2016, 21:13  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
всякий раз когда он тикает ты запрашиваешь у ОС ресурс
Ну, как бы у меня core i7 и при запуске программы он загружен всего на 10% Это при запущенных других программах. Я раньше писал скрипты под одну программу и там делал не один поток, у которого пауза была 50 мс и все нормально было...
Цитата Сообщение от mss Посмотреть сообщение
а взад не возвращаешь (ReleaseDC)
А как вернуть...? )
Цитата Сообщение от mss Посмотреть сообщение
И второй таймер, который вообще не нужен, у тебя занят той же чудесной "херью")
Да прога и с одним таймером так же виснет.

Добавлено через 5 минут
Вот пожалуйста... Код вообще из одного таймера и прога благополучно виснет через 5 мин...
Кликните здесь для просмотра всего текста
Delphi
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
37
38
39
40
41
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  bmp:TBitmap;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
    bmp := TBitmap.Create;
    bmp.Width := 370; // Ширина скрина
    bmp.Height := 53; // Высота скрина
    BitBlt(bmp.Canvas.Handle, 0,0, Screen.Width, Screen.Height,
    GetDC(0), 535,387,SRCCOPY); // 535,387 - Координата скрина
    Image1.Width := bmp.Width;
    Image1.Height := bmp.Height;
    Image1.Picture.Assign(bmp);
    bmp.Free;
end;
 
end.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
06.05.2016, 21:15
Цитата Сообщение от Hito Посмотреть сообщение
у меня core i7
Ну и любуйся им)
Речь-то о ресурсах ОС, а не о производительности процессора..

Цитата Сообщение от Hito Посмотреть сообщение
Я раньше писал
А надо было сначала читать.

Цитата Сообщение от Hito Посмотреть сообщение
как вернуть...?
Про ReleaseDC я с кем разгваривал, сам с собой ?)

Цитата Сообщение от Hito Посмотреть сообщение
прога и с одним таймером так же виснет
Но тебе мало - ты два забубенил)
0
0 / 0 / 0
Регистрация: 02.09.2015
Сообщений: 76
06.05.2016, 21:21  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Про ReleaseDC я с кем разгваривал, сам с собой ?)
Не понял... Я всего второе сообщение от Вас вижу тут... В первом было:
Цитата Сообщение от mss Посмотреть сообщение
а взад не возвращаешь (ReleaseDC)
На что я и задал вопрос - "А как вернуть...?" Так что я не знаю - где Вы и с кем разговаривали про ReleaseDC.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
06.05.2016, 21:25
Ну если в моем сообщении фигурирует ReleaseDC, а в твоем коде этого вызова нет, то это я кому и для чего, по-твоему, написал ?
Самому себе что ли ?)
Или все же тебе, чтобы ты подсутелился погуглить что это за зверь ?
0
0 / 0 / 0
Регистрация: 02.09.2015
Сообщений: 76
06.05.2016, 23:59  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Или все же тебе, чтобы ты подсутелился погуглить что это за зверь ?
Ну, вот как раз этим занимался сейчас... Просто пудумал, что я больше понял бы из Ваших примеров... Ну ладно - гуглю...)

Добавлено через 6 минут
Блин... Ну это попа... Это пол дня опять потратить, чтоб найти нормальный пример - как эта команда пишется... Ну, если вы знаете - неужели трудно дать пример на моем примере...?

Добавлено через 7 минут
Так?
Delphi
1
2
3
4
5
6
7
8
9
10
    ReleaseDC(0,bmp);
    bmp := TBitmap.Create;
    bmp.Width := 370; // Ширина скрина
    bmp.Height := 53; // Высота скрина
    BitBlt(bmp.Canvas.Handle, 0,0, Screen.Width, Screen.Height,
    GetDC(0), 535,387,SRCCOPY); // 535,387 - Координата скрина
    Image1.Width := bmp.Width;
    Image1.Height := bmp.Height;
    Image1.Picture.Assign(bmp);
    bmp.Free;
Добавлено через 36 минут
Разобрался...
Delphi
1
2
3
4
5
6
7
8
9
10
    bmp := TBitmap.Create;
    bmp.Width := 370; // Ширина скрина
    bmp.Height := 53; // Высота скрина
    BitBlt(bmp.Canvas.Handle, 0,0, Screen.Width, Screen.Height,
    GetDC(0), 535,387,SRCCOPY); // 535,387 - Координата скрина
    Image1.Width := bmp.Width;
    Image1.Height := bmp.Height;
    Image1.Picture.Assign(bmp);
    ReleaseDC(0, GetDC(0));
    bmp.Free;
Добавлено через 34 минуты
Нифига в общем не разобрался...

Добавлено через 1 час 3 минуты
Во!
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var DC: HDC;
begin
  bmp1 := TBitmap.Create;
  bmp1.Width := 200; // Ширина скрина
  bmp1.Height := 33; // Высота скрина
  DC:=GetDC(0);
  BitBlt(bmp1.Canvas.Handle, 0,0, Screen.Width, Screen.Height,
  DC, 573,103,SRCCOPY); // 573,103 - Координата скрина
  ReleaseDC(0, DC);
  Image1.Width := bmp1.Width;
  Image1.Height := bmp1.Height;
  Image1.Picture.Assign(bmp1);
  bmp1.Free;
end;
Добавлено через 3 минуты
Вот так все работает с двумя потоками!
Кликните здесь для просмотра всего текста
Delphi
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SyncObjs, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Image2: TImage;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TPotok_1 = class(TThread)
    Image1:TImage;
    private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure ScreenImage1;
  end;
 
  TPotok_2 = class(TThread)
    Image2:TImage;
    private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure ScreenImage2;
  end;
 
var
  Form1: TForm1;
  Potok_1: TPotok_1;
  Potok_2: TPotok_2;
  Potoki: Boolean;
  bmp1,bmp2:TBitmap;
 
implementation
 
{$R *.dfm}
 
procedure TPotok_1.ScreenImage1;
var DC: HDC;
begin
  bmp1 := TBitmap.Create;
  bmp1.Width := 200; // Ширина скрина
  bmp1.Height := 33; // Высота скрина
  DC:=GetDC(0);
  BitBlt(bmp1.Canvas.Handle, 0,0, Screen.Width, Screen.Height,
  DC, 573,103,SRCCOPY); // 573,103 - Координата скрина
  ReleaseDC(0, DC);
  Image1.Width := bmp1.Width;
  Image1.Height := bmp1.Height;
  Image1.Picture.Assign(bmp1);
  bmp1.Free;
end;
 
procedure TPotok_2.ScreenImage2;
var DC: HDC;
begin
  bmp2 := TBitmap.Create;
  bmp2.Width := 370; // Ширина скрина
  bmp2.Height := 53; // Высота скрина
  DC:=GetDC(0);
  BitBlt(bmp2.Canvas.Handle, 0,0, Screen.Width, Screen.Height,
  DC, 535,387,SRCCOPY); // 573,103 - Координата скрина
  ReleaseDC(0, DC);
  Image2.Width := bmp2.Width;
  Image2.Height := bmp2.Height;
  Image2.Picture.Assign(bmp2);
  bmp2.Free;
end;
 
procedure TPotok_1.Execute;
begin
while Potoki do
  begin
    Synchronize(ScreenImage1);
    Sleep (55)
  end;
end;
 
procedure TPotok_2.Execute;
begin
while Potoki do
  begin
    Synchronize(ScreenImage2);
    Sleep (55)
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Potoki := True;
 
  Potok_1:=TPotok_1.Create(False);
  Potok_1.Image1:=Image1;
  Potok_1.Priority:=tpNormal;
  Potok_1.FreeOnTerminate:=true;
 
  Potok_2:=TPotok_2.Create(False);
  Potok_2.Image2:=Image2;
  Potok_2.Priority:=tpNormal;
  Potok_2.FreeOnTerminate:=true;
 
  Button1.Enabled:= False;
  Button2.Enabled:= True;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Potoki := False;
  Button1.Enabled:= True;
  Button2.Enabled:= False;
  Image1.Picture := nil;
  Image2.Picture := nil;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Button2.Enabled:= False;
end;
 
end.

Фух!... Можно расслабиться...
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
07.05.2016, 00:23
Цитата Сообщение от Hito Посмотреть сообщение
Ребят, я тут с потоками чуток поэкспериментировал
Лучше бы ты с таймером разобрался. Понял как он работает и как его правильно использовать в твоей задаче. Но какие-то троешники убедили тебя что потоки это панацея.
ССЗБ
0
0 / 0 / 0
Регистрация: 02.09.2015
Сообщений: 76
07.05.2016, 00:27  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Лучше бы ты с таймером разобрался
В том-то и дело, что с ним я уже разобрался )) Вот и мучаю потоки ))) Ребят, никто не говорит, что я в потоках оставлю скрины экрана. Но разобраться мне в этом НАДО было..

Добавлено через 1 минуту
Цитата Сообщение от northener Посмотреть сообщение
ССЗБ
Эт че такое..?
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
07.05.2016, 00:31
Цитата Сообщение от Hito Посмотреть сообщение
В том-то и дело, что с ним я уже разобрался )) Вот и мучаю потоки ))) Ребят, никто не говорит, что я в потоках оставлю скрины экрана. Но разобраться мне в этом НАДО было..
В потоках ты разобрался на тройку с минусом. С таймером тоже также?
Цитата Сообщение от Hito Посмотреть сообщение
Эт че такое..?
https://yandex.ru/yandsearch?c... 0%B7%D0%B1
0
0 / 0 / 0
Регистрация: 02.09.2015
Сообщений: 76
07.05.2016, 00:37  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
В потоках ты разобрался на тройку с минусом.
Я разобрался на уровне РАБОЧЕГО кода. Я благодарю конечно за ссылки, которые мне тут давали, но для того, чтобы дать оценку моей работе, нужен эталон, а из вас тут НИ ОДИН, НИ МАЛЕЙШЕГО примера так и не дал. Ну, вот только krapotkin дал пример один...
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
07.05.2016, 00:46
Цитата Сообщение от Hito Посмотреть сообщение
Я разобрался на уровне РАБОЧЕГО кода
Нифига не разобрался! В твоих потоках не выполняется ничего, кроме
Delphi
1
Sleep (55)
Т.е. они представляют собой только кривые костыли для замены таймера.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.05.2016, 00:46

Потоки
Создал поток вручную и с помощью этого кода по одному разу загрузил строку "Текст" из каждого из 10 потоков. Код отработал...

Потоки
Я новичок и не могу понять почему каждый поток берёт одну и тужу страницу. исходник я приложил.

Потоки
Всё сделал как тут http://www.delphi-manual.ru/threads.php И когда начинаю компилить, компилятор выдаёт ошибки, то ли у меня руки кривые...

Потоки
Возникла такая проблема : в собственном веббраузере например при переходе на ссылку добавить ее в историю ,но только если она...

Потоки
Вот простенькая программка, 2 прогресс бара и 1 кнопка. При нажатии кнопки ПБ медленно заполняются по очереди. В это время окно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru