![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание потоков
Макака © (2016-03-15 15:48:00)Нужно создать 4 потока
Я правильно понял, для этого достаточно создать 4 класса TThread ?
И правильно ли я понял, что эти 4 потока будут выполняться на разных ядрах?
Макака (2016-03-16 18:22:00) [21]нужно ещё один поток создавать?
Макака (2016-03-16 18:21:00) [22]изменил тип массива на
Handles : array of THandle;
заговорила)
Но на этом приключения не закончились, до момента "приехали" виснет приложение.
Макака (2016-03-16 18:07:00) [23]
if (WaitForMultipleObjects(4,@Handles[0],true,infinite) = WAIT_OBJECT_0) then
ShowMessage('Всё, приехали!');
Молчит
Inovet (2016-03-16 17:40:00) [24]> [34] Макака (16.03.16 16:54)
> if (WaitForMultipleObjects(4,@Handles,true,infinite) = 1)
Зачем 1? Вот здесь смотри символьные значения возврата
https://msdn.microsoft.com/en-us/library/windows/desktop/ms687025%28v=vs.85%29.aspx
Юрий Зотов (2016-03-16 17:20:00) [25]Handles - это, по сути, указатель. Поэтому @Handles - это адрес указателя, но не массива. А вот @Handles[0] - это адрес массива.
Макака (2016-03-16 16:54:00) [26]WaitForMultipleObjects и как он работает?)
делаю так, на 4 потока:
var Handles : array of Cardinal;
..................
SetLength(Handles,4);
Thread_1:=TNewThread.Create(true);
Handles[0]:=Thread_1.Handle;
Thread_1.FreeOnTerminate:=true;
Thread_1.Priority:=tpNormal;
Thread_1.I1:=0;
Thread_1.I2:=51;
Thread_1.TreadNumb:=0;
Thread_1.Resume;
...............................итак со всеми
if (WaitForMultipleObjects(4,@Handles,true,infinite) = 1) then
ShowMessage('Всё, приехали!');
Inovet (2016-03-16 15:32:00) [27]> [32] Макака (16.03.16 15:24)
> а как это сделать?
WaitForMultipleObjects
Макака (2016-03-16 15:24:00) [28]Inovet это я прекрасно понял) а как это сделать?
Можно написать так Sleep(замерить макс время выполнения и написать сюда);
пойду погуглю ещё
Inovet (2016-03-16 15:15:00) [29]С отдельной DLL на каждый поток - это какой стиль? По-моему китайский.
Inovet (2016-03-16 15:14:00) [30]> [29] Макака (16.03.16 15:08)
Обяснили же: есть основной поток, который запускает остальные. Вот он пусть ждёт завершения и дальше делает ещё что-то.
Макака (2016-03-16 15:08:00) [31]А как сделать, чтобы после завершения работы всех 4ёх потоков выполнялся код?
Макака (2016-03-16 14:29:00) [32]создал 4 дллки, и 4 отедльных функции на экспорт в каждой, только так сработало
Юрий Зотов (2016-03-16 14:27:00) [33]> Макака (16.03.16 14:15) [26]
1. Запускается не DLL, а функции из нее.
2. Можно, если в DLL нет специальных препятствий для этого.
Макака (2016-03-16 14:15:00) [34]Ещё такой вопрос, есть длл, можно её запустить в 4 разных потоках?
Макака (2016-03-16 12:20:00) [35]Всем спасибо!
Макака (2016-03-16 12:19:00) [36]Всё получилось, когда правильно скопировал экземпляры класса.
Rouse_ (2016-03-16 10:09:00) [37]
> Макака (16.03.16 01:49) [19]
Ну ты код для начала посмотри, который я тебе написал выше, все вопросы отпадут.
Юрий Зотов (2016-03-16 09:22:00) [38]> Макака (16.03.16 01:36) [18]
> создал несколько экземпляров, заполнил первый данными, копировал так:
> Экземпляр2:= Экземпляр1, этого же достаточно для копирования?
Нет. Любая объектная переменная по сути есть указатель, ссылка на объект. Сам объект лежит где-то в динамической памяти, а ссылка лишь хранит его адрес.
Поэтому Вы копируете не объект, а его адрес. То есть, обе переменные (и Экземпляр1, и Экземпляр2) у Вас указывают на один и тот же поток.
sniknik (2016-03-16 08:38:00) [39]> У меня нет в потоках обращения к одним и тем же VCL компонентам, поэтому синхронизация мне не нужна,
тебе может и нет, а программе нужна.
> поэтому 100 процентов дело в распараллеливании.
дело всегда в прокладке.
popcorn++ (2016-03-16 03:14:00) [40]Удалено модератором