0 / 0 / 0
Регистрация: 26.02.2016
Сообщений: 3
1

Объяснить работу программы с потоками

03.03.2017, 19:12. Показов 1056. Ответов 5

Есть программа на DELPHI С ПОТОКАМИ и она не работает при компиляции(а если запустить .exe она работает), Delphi ругается на GetProcessAffinityMask(GetCurrentProcess, PAM, SAM).
Выдает "Unit1.pas(68): E2033 Types of actual and formal var parameters must be identical"

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
136
137
138
139
140
141
142
143
144
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;
 
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    StringGrid3: TStringGrid;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Cells[0,0]:= 'A';
  StringGrid1.Cells[0,1]:= 'B';
  StringGrid2.Cells[0,0]:= 'C';
  StringGrid3.Cells[0,0]:= 'D';
end;
 
procedure TForm1.Button1Click(Sender: TObject);
 
var
  A,B,C,D: Array[1..10] of ShortInt;
  i: ShortInt;
 
  StartValue, EndValue, Freq: Int64;
  sD, sA: Double;
 
  PriorityClass, Priority: Integer;
  // PriorityClass - приоритет класса.
  // Priority - приоритет потока
 
  PAM, SAM, PAMR, PAML, PAM1: Cardinal;
  // PAM - битовая маска, где каждый бит обозначает ядро,
  // на котором разрешается запуск процесса.
  // SAM - битовая маска, где каждый бит обозначает ядро, которое
  // сконфигурировано в систему.
 
  mask: array[1..4] of Cardinal; // Битовые маски, задающие одно ядро
 
begin
  PriorityClass:= GetPriorityClass(GetCurrentProcess); //Текущий приоритет класса
  Priority:= GetThreadPriority(GetCurrentThread); //Текущий приоритет потока
  GetProcessAffinityMask(GetCurrentProcess, PAM, SAM); //Текущая маска PAM
 
  mask[1]:= 1; // Битовая маска 0001 первого ядра
  mask[2]:= 2; // Битовая маска 0010 второго ядра
  mask[3]:= 4; // Битовая маска 0100 третьего ядра
  mask[4]:= 8; // Битовая маска 1000 четвертого ядра
  PAML:= PAM;
  i:= 1;
  while PAML=PAM do
  begin
    PAMR:= PAM shr i;
    PAML:= PAMR shl i;
    if PAML<>PAM then PAM1:= mask[i];
    Inc(i);
  end;
  SetThreadAffinityMask(GetCurrentThread, PAM1); //Работа на одном ядре
 
  for i:=1 to 10 do
  begin
    A[i]:= StrToInt(StringGrid1.Cells[i,0]);
    B[i]:= StrToInt(StringGrid1.Cells[i,1]);
  end;
 
  SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); //Новый приоритет класса
  SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL); //Новый приоритет потока
  QueryPerformanceCounter(StartValue);
  for i:=1 to 10 do
  begin
    C[i]:= B[i] shr 2;
    C[i]:= (87*B[i] + 14) div (A[i] - C[i]);
  end;
  QueryPerformanceCounter(EndValue);
  QueryPerformanceFrequency(Freq);
  SetThreadPriority(GetCurrentThread, Priority); //Восстановление приоритета потока
  SetPriorityClass(GetCurrentProcess, PriorityClass); //Восстановление приоритета класса
  Edit3.Text:= IntToStr(EndValue - StartValue);
  sD:= (EndValue - StartValue)/Freq;
  Form1.Edit1.Text:= FloatToStrF(sD, ffFixed, 10, 9);
    
  for i:=1 to 10 do
  StringGrid2.Cells[i,0]:= IntToStr(C[i]);
 
  SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); //Новый приоритет класса
  SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL); //Новый приоритет потока
  QueryPerformanceCounter(StartValue);
  asm
       MOV ECX, 10
       XOR ESI, ESI
@M1:   MOV AL, 87
       IMUL BYTE PTR B[ESI]
       ADD AX, 14
       MOV BL, BYTE PTR B[ESI]
       SAR BL, 2
       SUB BL, BYTE PTR A[ESI]
       NEG BL
       IDIV BL
       MOV BYTE PTR D[ESI], AL
       INC ESI
       LOOP @M1
  end;
  QueryPerformanceCounter(EndValue);
  QueryPerformanceFrequency(Freq);
  SetThreadPriority(GetCurrentThread, Priority); //Восстановление приоритета потока
  SetPriorityClass(GetCurrentProcess, PriorityClass); //Восстановление приоритета класса
  Form1.Edit4.Text:= IntToStr(EndValue - StartValue);
  sA:= (EndValue - StartValue)/Freq;
  Form1.Edit2.Text:= FloatToStrF(sA, ffFixed, 10, 9);
 
  for i:=1 to 10 do
  Form1.StringGrid3.Cells[i,0]:= IntToStr(D[i]);
 
  SetThreadAffinityMask(GetCurrentThread, PAM); // Восстановление количества ядер
 
end;
 
 
end.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2017, 19:12
Ответы с готовыми решениями:

Объяснить работу программы
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; int main() { char mas; int...

Объяснить работу программы
Здравствуйте. Такая задача была: Нашёл на форуме подходящую рабочую программу, но не могу...

Объяснить работу программы
Во введенном слове подсчитать количество различных пар букв. Например, в слове babacabacd 5...

Факториал, объяснить работу программы
Ребята, написал программу для вычисления факториала, а словесно не могу ее рассказать( int...

5
5235 / 4087 / 1342
Регистрация: 14.04.2014
Сообщений: 18,718
Записей в блоге: 18
03.03.2017, 19:32 2
если компилятор выдает ошибку, то никакого exe не существует
не морочьте голову читающим

function GetProcessAffinityMask(hProcess: THandle;
var lpProcessAffinityMask, lpSystemAffinityMask: DWORD_PTR)

DWORD_PTR и Cardinal - найдите 8 отличий
0
0 / 0 / 0
Регистрация: 26.02.2016
Сообщений: 3
03.03.2017, 19:47  [ТС] 3
я взял готовую программу с проектом, потом открыл проект, когда стал компилировать она не сработала
0
5235 / 4087 / 1342
Регистрация: 14.04.2014
Сообщений: 18,718
Записей в блоге: 18
04.03.2017, 01:43 4
короче, объясните что на самом деле вам нужно
0
81 / 81 / 39
Регистрация: 17.02.2016
Сообщений: 464
04.03.2017, 08:39 5
krapotkin, если я верно понял - скомпилировать чужой код, который написан не понятно на какой версии дельфи
0
0 / 0 / 0
Регистрация: 26.02.2016
Сообщений: 3
04.03.2017, 14:19  [ТС] 6
Пацаны все нормально, запустил на делфи 7
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2017, 14:19
Помогаю со студенческими работами здесь

Рекурсия, объяснить работу программы
Вообщем мое ( пока самостоятельное ) обучение продолжается и попал я вот на такую замечательную...

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

Объяснить работу программы (структуры, файловый ввод/вывод)
объясните программу чему равняется v0??? и зачем int v=111??? #include &lt;iostream&gt; #include...

Объяснить работу программы (Среднее геометрическое каждой строки матрицы)
A(k,n) Найти среднее геометрическое каждой строки p^1/n p-произведение n-кол-во Код...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru