Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 26
1

Задача выполняется долго на одном ядре процессора - можно ли ее распараллелить

25.04.2015, 02:21. Показов 2752. Ответов 42
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, коллеги!
Я с Delphi работаю давно, но монгопоточность не использовал. Сделал пока тупую переделку из однопоточной реализации алгоритма, для отработки собственно синтаксиса потоков... Об оптимизации пока речь не идет. Хоть как бы заработало без ошибок.
Пока никак, вылетает с AccessViolation.

Смысл в том, что во вложенных циклах перебираются все комбинации 4-х численных переменных. Происходят некие вычисления, в основном чтение из большого массива глобальной переменной, анализ данных и выдача результатов в другой массив глобальной переменной, вывод некоторых данных в окошко формы.
Задача выполняется долго, на одном ядре процессора. Хочется распараллелить.
Что я делаю не так?

Код ниже.
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
unit MainUnit;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, TabNotBk, StdCtrls, TeeProcs, TeEngine,
  Chart, Series, Buttons, SyncObjs;
 
Const
 MaxColBars = 1000000;
 MaxColSD = 100000;
 MaxAv      = 255;
 
Type
  BarType=Array[1..MaxColBars] of Word;
  AVT=Array[1..MaxColBars] of Single;
  BallType=Array[1..MaxColSD] of Longint;
  RezType=array[1..6] of BallType;
  AvType=array[1..MaxAv] of AVT;
 
type
  TFX = class(TForm)
    TabbedNotebook1: TTabbedNotebook;
....
 
 
// глобальные переменные 
var
  FX                              : TFX;
  CS                              : TCriticalSection;
  MaxNumThreads           : Byte;
  FThreadRefCount            : Word;
...
 
 
implementation
 
{$R *.dfm}
 
// функция - поток
procedure ThreadFunc;
Var
...
begin
  CS.Enter;
// Считывание некоторых глобальные переменных в локальные
...
  CS.Leave;
 
// Вычисления
 
  CS.Enter;
// Чтение и/или запись в глобальные массивы
...
  CS.Leave;
 
 
  CS.Enter;
  Dec(FThreadRefCount);                                       
  FX.Caption:=IntToStr(FThreadRefCount)+' нитей';  
  CS.Leave;
  endthread(0);
end;
 
procedure TFX.FormCreate(Sender: TObject);
begin
  FThreadRefCount:=0;
  CS:=TCriticalSection.Create;
end;
 
procedure TFX.FormDestroy(Sender: TObject);
begin
  CS.Free;
end;
 
 
 
 
// Вызов нитей в количестве не больше MaxNumThreads           
 
procedure TFX.SuperButtonClick(Sender: TObject);
Var
...
  tid1, id                  : LongWord;
begin
 
  KolVars:=(Av1_k-Av1_n + 1) * (Av2_k-Av2_n + 1) * (Av3_k-Av3_n + 1) * (Av4_k-Av4_n + 1);
 
  ProgressBar1.Min:=1;
  ProgressBar1.Max:=KolVars;
  ProgressBar1.Position:=ProgressBar1.Min;
 
...
 
  Av1:=Av1_n-1;
  while Av1<Av1_k do Begin
    inc(Av1);
    Av2:=Av2_n-1;
    while Av2<Av2_k do Begin
      inc(Av2);
      Av3:=Av3_n-1;
      while Av3<Av3_k do Begin
        inc(Av3);
        Av4:=Av4_n-1;
        while Av4<Av4_k do Begin
          inc(Av4);
          if (Av1<>Av2) and (Av1<>Av3) and (Av1<>Av4) and (Av2<>Av3) and (Av2<>Av4) and (Av3<>Av4) then Begin
 
                while FThreadRefCount>=MaxNumThreads do Application.ProcessMessages;
 
                if FThreadRefCount<MaxNumThreads then Begin
 
                  tid1:=beginthread(nil,0,Addr(ThreadFunc),nil,0,id);
                  if tid1<>0 then CloseHandle(tid1);
                  Inc(FThreadRefCount);
                  FX.Caption:='IntToStr(FThreadRefCount)+' нитей';
 
                end;
 
                ProgressBar1.Position:=ProgressBar1.Position+1;
          end;
        end;
      end;
    end;
  end;
end;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2015, 02:21
Ответы с готовыми решениями:

Запуск 22-х ядерного процессора на одном ядре
Доброго времени суток! Не подскажите мне программу для двух ядерного проца что бы запустить его на...

Повышенное напряжение на ядре процессора
Здравствуйте!У меня , и у моего процессора(core i5 650) проблема с напряжением на ядре.В идеале там...

Рекурсивный метод проверки файлов на изменения на одном четвёртом ядре
Всем привет. Подскажите пожалуйста такую вещь. Перед выпуском патча игры создаю БД (sqlite) файлов...

На одном ядре 90-100% во время простоя (Intel core i3 2100)
Не подскажите почему у меня одно ядро зашкаливает на 100-90% во время простоя?

42
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
25.04.2015, 02:27 2
Цитата Сообщение от BittenByCat Посмотреть сообщение
Здравствуйте, коллеги!
Я с Delphi работаю давно
И до сих пор не научился форматировать код?
Твою простыню читать - врагу не пожелаешь. А в ней ещё и купюры есть.
Ты специально постарался сделать максимум того, чтобы тебе никто не ответил/не помог?
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 26
25.04.2015, 02:31  [ТС] 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
unit MainUnit;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, TabNotBk, StdCtrls, TeeProcs, TeEngine,
  Chart, Series, Buttons, SyncObjs;
 
Const
 MaxColBars = 1000000;
 MaxColSD = 100000;
 MaxAv      = 255;
 
Type
  BarType=Array[1..MaxColBars] of Word;
  AVT=Array[1..MaxColBars] of Single;
  BallType=Array[1..MaxColSD] of Longint;
  RezType=array[1..6] of BallType;
  AvType=array[1..MaxAv] of AVT;
 
type
  TFX = class(TForm)
    TabbedNotebook1: TTabbedNotebook;
....
 
 
// глобальные переменные 
var
  FX                              : TFX;
  CS                              : TCriticalSection;
  MaxNumThreads           : Byte;
  FThreadRefCount            : Word;
...
 
 
implementation
 
{$R *.dfm}
 
// функция - поток
procedure ThreadFunc;
Var
...
begin
  CS.Enter;
// Считывание некоторых глобальные переменных в локальные
...
  CS.Leave;
 
// Вычисления
 
  CS.Enter;
// Чтение и/или запись в глобальные массивы
...
  CS.Leave;
 
 
  CS.Enter;
  Dec(FThreadRefCount);                                       
  FX.Caption:=IntToStr(FThreadRefCount)+' нитей';  
  CS.Leave;
  endthread(0);
end;
 
procedure TFX.FormCreate(Sender: TObject);
begin
  FThreadRefCount:=0;
  CS:=TCriticalSection.Create;
end;
 
procedure TFX.FormDestroy(Sender: TObject);
begin
  CS.Free;
end;
 
 
 
 
// Вызов нитей в количестве не больше MaxNumThreads           
 
procedure TFX.SuperButtonClick(Sender: TObject);
Var
...
  tid1, id                  : LongWord;
begin
 
  KolVars:=(Av1_k-Av1_n + 1) * (Av2_k-Av2_n + 1) * (Av3_k-Av3_n + 1) * (Av4_k-Av4_n + 1);
 
  ProgressBar1.Min:=1;
  ProgressBar1.Max:=KolVars;
  ProgressBar1.Position:=ProgressBar1.Min;
 
...
 
  Av1:=Av1_n-1;
  while Av1<Av1_k do Begin
    inc(Av1);
    Av2:=Av2_n-1;
    while Av2<Av2_k do Begin
      inc(Av2);
      Av3:=Av3_n-1;
      while Av3<Av3_k do Begin
        inc(Av3);
        Av4:=Av4_n-1;
        while Av4<Av4_k do Begin
          inc(Av4);
          if (Av1<>Av2) and (Av1<>Av3) and (Av1<>Av4) and (Av2<>Av3) and (Av2<>Av4) and (Av3<>Av4) then Begin
 
                while FThreadRefCount>=MaxNumThreads do Application.ProcessMessages;
 
                if FThreadRefCount<MaxNumThreads then Begin
 
                  tid1:=beginthread(nil,0,Addr(ThreadFunc),nil,0,id);
                  if tid1<>0 then CloseHandle(tid1);
                  Inc(FThreadRefCount);
                  FX.Caption:='IntToStr(FThreadRefCount)+' нитей';
 
                end;
 
                ProgressBar1.Position:=ProgressBar1.Position+1;
          end;
        end;
      end;
    end;
  end;
end;
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
25.04.2015, 02:43 4
Цитата Сообщение от BittenByCat Посмотреть сообщение
Попытка номер два.
С форматированием уже лучше стало.
Но AccessViolation это такая штука, причину которой весьма трудно найти даже в "форматированной простыне". Уж извини. Если можешь сказать после каких действий в программе получаешь AV, то может что-то смогу подсказать. Если нет, то только поможет прикладывание к сообщению проекта в целом.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
25.04.2015, 09:51 5
и самое главное нужно написать еще, а что должно происходить-то
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 26
28.04.2015, 17:09  [ТС] 6
Извиняюсь, что долго не отвечал. Наконец дошли руки до этой программы.
Путем экспериментов выяснилось, что сбой вызывает попытка копирования массива, тип которого задается в основном модуле (BarType).
Что же с этим делать?

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
unit MainUnit;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, TabNotBk, StdCtrls, TeeProcs, TeEngine,
  Chart, Series, Buttons, SyncObjs;
 
Const
 MaxColBars = 1000000;
 MaxColSD = 100000;
 MaxAv      = 255;
 
Type
  BarType=Array[1..MaxColBars] of Word;
  AVT=Array[1..MaxColBars] of Single;
  BallType=Array[1..MaxColSD] of Longint;
  RezType=array[1..6] of BallType;
  AvType=array[1..MaxAv] of AVT;
 
type
  TFX = class(TForm)
    TabbedNotebook1: TTabbedNotebook;
....
 
 
// глобальные переменные 
var
  FX                              : TFX;
  CS                              : TCriticalSection;
  MaxNumThreads, FThreadRefCount  : Byte;
  Bar                             : BarType;
...
 
 
implementation
 
{$R *.dfm}
 
// функция - поток
procedure ThreadFunc;
Var
  FBar                              : BarType;
...
begin
  CS.Enter;
  FBar:=Bar;    // <-- этот код вызывает Access Violation, что с применением крит. секции, что без нее
  CS.Leave;
 
 
  CS.Enter;                                          // этот код выполняется без проблем
  Dec(FThreadRefCount);                                         
  FX.Caption:=IntToStr(FThreadRefCount)+' нитей';   
  CS.Leave;
  endthread(0);
end;
 
procedure TFX.FormCreate(Sender: TObject);
begin
  FThreadRefCount:=0;
  CS:=TCriticalSection.Create;
end;
 
procedure TFX.FormDestroy(Sender: TObject);
begin
  CS.Free;
end;
 
 
 
 
// Вызов нитей в количестве не больше MaxNumThreads           
 
procedure TFX.SuperButtonClick(Sender: TObject);
Var
...
  tid1, id                  : LongWord;
begin
 
  KolVars:=(Av1_k-Av1_n + 1) * (Av2_k-Av2_n + 1) * (Av3_k-Av3_n + 1) * (Av4_k-Av4_n + 1);
 
  ProgressBar1.Min:=1;
  ProgressBar1.Max:=KolVars;
  ProgressBar1.Position:=ProgressBar1.Min;
 
...
 
  Av1:=Av1_n-1;
  while Av1<Av1_k do Begin
    inc(Av1);
    Av2:=Av2_n-1;
    while Av2<Av2_k do Begin
      inc(Av2);
      Av3:=Av3_n-1;
      while Av3<Av3_k do Begin
        inc(Av3);
        Av4:=Av4_n-1;
        while Av4<Av4_k do Begin
          inc(Av4);
          if (Av1<>Av2) and (Av1<>Av3) and (Av1<>Av4) and (Av2<>Av3) and (Av2<>Av4) and (Av3<>Av4) then Begin
 
                while FThreadRefCount>=MaxNumThreads do Application.ProcessMessages;
 
                if FThreadRefCount<MaxNumThreads then Begin
 
                  tid1:=beginthread(nil,0,Addr(ThreadFunc),nil,0,id);
                  if tid1<>0 then CloseHandle(tid1);
                  Inc(FThreadRefCount);
                  FX.Caption:='IntToStr(FThreadRefCount)+' нитей';
 
                end;
 
          end;
 
                ProgressBar1.Position:=ProgressBar1.Position+1;
        end;
      end;
    end;
  end;
end;
Добавлено через 25 минут
Дальнейшие эксперименты показали, что проблема в том, что массив
Array[1..1000000] of Word; - слишком большой для нити.
вот такой уже работает:
Array[1..100000] of Word;

Добавлено через 6 минут
Ok. Значит этот массив не копируем, будем обращаться из ThreadFunc к внешнему.

Добавлено через 4 минуты
У меня к вам вопрос.
Вообще имеет ли смысл копировать глобальные переменные в локальные для нити, если доступ к ним из нити предполагается только на чтение. И нужно ли при чтении глобальных переменных внутри нити, делать это в критических секциях?

Добавлено через 1 час 3 минуты
Еще такой вопрос.
Если один поток будет писать в глобальную переменную в критической секции, и в это же время другой поток затребует чтение из этой переменной (без критической секции - чтение же), что будет?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
28.04.2015, 20:53 7
Цитата Сообщение от BittenByCat Посмотреть сообщение
Если один поток будет писать в глобальную переменную в критической секции, и в это же время другой поток затребует чтение из этой переменной (без критической секции - чтение же), что будет?
Бардак будет, если операция чтения/записи не атомарная)


Цитата Сообщение от BittenByCat Посмотреть сообщение
Вообще имеет ли смысл ..глобальные переменные
Глобальные переменные вообще не имеют смысла, если без них можно обойтись и нужно обходиться
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 26
28.04.2015, 21:20  [ТС] 8
Цитата Сообщение от mss Посмотреть сообщение
Бардак будет, если операция чтения/записи не атомарная)
Как сделать, чтобы было атомарно?

Цитата Сообщение от mss Посмотреть сообщение
Глобальные переменные вообще не имеют смысла, если без них можно обойтись и нужно обходиться
Можно бы было, обошелся бы. )
Например счетчик числа нитей. Время от времени выбивало ошибку IntegerOweflov на его декременте в нити:
Delphi
1
2
3
 CS.Enter;
 Dec(FThreadRefCount);                                         
 CS.Leave;
Решил это пока так.
Сделал инкремент в основном потоке еще до запуска нити. И поместил его там тоже в критическую секцию.
На сколько это правильно?...
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
28.04.2015, 21:29 9
Цитата Сообщение от BittenByCat Посмотреть сообщение
Как сделать, чтобы было атомарно?
Атрмарными можно считать только операции с данными размером в 1 байт.

Цитата Сообщение от BittenByCat Посмотреть сообщение
счетчик числа нитей...выбивало ошибку IntegerOweflov
Ну а с чего ты взял что виновата в этом не иначе как кривая работа с крит.секциями ?)
И причем здесь глобальность переменной ?
Те же грабли ждут при любой ее области видимости)

Цитата Сообщение от BittenByCat Посмотреть сообщение
Можно бы было, обошелся бы

Вот и обходись, никто же не запрещает)
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 26
28.04.2015, 21:47  [ТС] 10
Цитата Сообщение от mss Посмотреть сообщение
Атрмарными можно считать только операции с данными размером в 1 байт.
Тогда почему возникают проблемы со счетчиком нитей, если это байтовая переменная?
MaxNumThreads, FThreadRefCount : Byte;

Увеличение происходит до запуска нити. Уменьшение - перед уничтожением.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
28.04.2015, 21:50 11
Цитата Сообщение от BittenByCat Посмотреть сообщение
если это байтовая переменная?
Это какая байтовая ? FThreadRefCount что ли ?
Ну и где же она байтовая, если она объявлена как Word ?
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 26
28.04.2015, 21:52  [ТС] 12
Цитата Сообщение от mss Посмотреть сообщение
Ну и где же она байтовая, если она объявлена как Word ?
Это было в 1й версии. Теперь байт.

Пока обошел эту ошибку, сделав счетчик Integer.
И без крит. секций инкремент/декремент вот этими операторами:
InterlockedDecrement(FThreadRefCount);
InterlockedIncrement(FThreadRefCount);
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
28.04.2015, 21:59 13
Цитата Сообщение от BittenByCat Посмотреть сообщение
Теперь байт
Ну и на чем ты сэкономил ?
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 26
28.04.2015, 22:09  [ТС] 14
Цитата Сообщение от mss Посмотреть сообщение
Ну и на чем ты сэкономил ?
Тебе на психологический форум надо, а не на програмистский. Такие ответы в стиле "ну ты и дебил" исходят обычно от людей с большими проблемами... зажатое эго прет, найдя микроскопическое якобы превосходство над кем-то в чем-то. )))
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
28.04.2015, 22:09 15
и самое главное нужно написать еще, а что должно происходить-то
Цитата Сообщение от BittenByCat Посмотреть сообщение
while FThreadRefCount>=MaxNumThreads do Application.ProcessMessages;
это апофеоз использования потоков
все что делалось раньше, делалось, чтобы этого не было!

может, все-таки объяснишь, что конкретно должно происходить, а тебе смогут рассказать не как запускать потоки, а как надо сделать, чтобы решить задачу
1
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
28.04.2015, 22:13 16
BittenByCat,

Не по теме:

а что это ты так раздухарился ?
Отголоски недопережитых комплексов прыщавого тинейджера ?)


Я всего лишь стремлюсь заставить тебя думать, рассуждая вслух .. Истина-то рождается в движении мысли)
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 26
28.04.2015, 22:20  [ТС] 17
Цитата Сообщение от krapotkin Посмотреть сообщение
может, все-таки объяснишь, что конкретно должно происходить, а тебе смогут рассказать не как запускать потоки, а как надо сделать, чтобы решить задачу
В основном модуле происходит перебор четырех параметров в заданных диапазонах.
Для каждого набора этих четырех параметров нужно произвести расчеты.
Кстати передачу этих параметров в потоки я уже реализовал через 4-й параметр функции BeginThread -
Param : Pointer;
Расчеты проводятся в еще одном цикле.
Результаты должны записаться в результирующий массив.
Массивы входных данных достаточно большие - под Гигабайт.

Программа относительно заработала. Но время от времени происходит IntegerOwerflov на декременте счетчика нитей.
И еще она иногда просто повисает. Похоже потоки входят в бесконечный цикл.

Добавлено через 3 минуты
Цитата Сообщение от krapotkin Посмотреть сообщение
Сообщение от BittenByCat
while FThreadRefCount>=MaxNumThreads do Application.ProcessMessages;
это апофеоз использования потоков
все что делалось раньше, делалось, чтобы этого не было!
Кстати, а как это место правильно сделать?
Нужно, что бы для каждой итерации основного цикла, перебирающего 4 параметра, запустилась нить, которая проведет расчеты для этой комбинации. И при этом число нитей не превысило максимально заданное. И чтобы окошко формы не залипало. )
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
28.04.2015, 22:20 18
Цитата Сообщение от BittenByCat Посмотреть сообщение
Кстати передачу этих параметров в потоки я уже реализовал через 4-й параметр функции BeginThread
Функции !
Кстати )...
Так почему же ты объявил ее как процедуру ?
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 26
28.04.2015, 22:25  [ТС] 19
Цитата Сообщение от mss Посмотреть сообщение
Функции !
Кстати )...
Так почему же ты объявил ее как процедуру ?
BeginThread - это системная функция, запускающая процедуру или функцию нити.
А нить у меня в процедуре. ThreadFunc.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
28.04.2015, 22:31 20
Цитата Сообщение от BittenByCat Посмотреть сообщение
как это место правильно сделать?
Начинать нужно совсем с другого места - с полной ликвидации в теле поточной функции любых обращений к глобальным переменным, к формам, к компонентам на этих формах.

Поточная ф-ция, прежде всего, должна быть независима и самодостаточна - получила вх.параметр[ы], произвела необходимые вычисления, вернула/выгрузила их результат[ы], как и положено ф-ции или процедуре, либо через Result либо черех вх.параметры, переданные по ссылке

Добавлено через 1 минуту
Цитата Сообщение от BittenByCat Посмотреть сообщение
А нить у меня в процедуре. ThreadFunc
И опять нет логики)
Нить у тебя в процедуре, а обозвал ты ее таки ThreadFunc..

Добавлено через 2 минуты
Цитата Сообщение от BittenByCat Посмотреть сообщение
endthread(0)
Вот это тоже сомнительный и рискованый финт.
Он тебе вообще зачем ?
0
28.04.2015, 22:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2015, 22:31
Помогаю со студенческими работами здесь

Назначить каждому потоку на каком ядре процессора работать
как на с# назначить каждому потоку на каком процессоре ему работать если в системе 4 проца

Код не выполняется в одном месте, но выполняется в другом
Вот код процедуры: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)...

Распараллелить выполнение цикла на все ядра процессора
Есть цикл for с очень большим количеством итераций, его выполнение отнимает кучу времени, хочу его...

Как настроить Планировщик задач так, чтобы один процесс работал полностью на одном ядре?
Здравствуйте. Подскажите пожалуйста, есть ли возможность настроить планировщик задач в windows...

Программа долго выполняется
Добрый день, товарищи. Написал прогу, кодирующую данные#include &lt;iostream&gt; #include&lt;fstream&gt;...

Долго выполняется запрос
Всем привет. Довольно долго (порядка 30-40 секунд) выполняется запрос. Подскажите где, что...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru