Управление потоками
От: the_moon  
Дата: 10.10.02 05:25
Оценка:
Привет,

у меня есть два потока, один очень критичный ко времени выполнения ( рисование графики ), другой не очень. Так вот если я их запускаю, то если управление передается второму потоку, то первый замирает на полсекунды и это очень заметно, то-есть мне бы хотелось бы как-то регулировать время на которое второй поток забирает управление, а потом его останавливать. Мне кажется Sleep вставлять как-то не очень хорошее решение или это так и делается?

Спасибо
KOPOTbILLIKA KPbIC
Re: Управление потоками
От: achumack  
Дата: 10.10.02 06:16
Оценка: 2 (1)
Здравствуйте the_moon, Вы писали:


Посмотри fibers. Ето то что тебе нужно. Сам выбираешь время переключения.
Re: Управление потоками
От: server_mouse Беларусь  
Дата: 10.10.02 06:16
Оценка:
Здравствуйте the_moon, Вы писали:

TM>Привет,


TM>у меня есть два потока, один очень критичный ко времени выполнения ( рисование графики ), другой не очень. Так вот если я их запускаю, то если управление передается второму потоку, то первый замирает на полсекунды и это очень заметно, то-есть мне бы хотелось бы как-то регулировать время на которое второй поток забирает управление, а потом его останавливать. Мне кажется Sleep вставлять как-то не очень хорошее решение или это так и делается?


1. Может имеет смысл создавать поток в состоянии ожидания (CREATE_SUSPENDED) и затем выгадав свободную секунду запускать из первого потока?
2. Ты ведь воспользовался
SetThreadPriority(hThread,THREAD_PRIORITY_IDLE);

для второго потока?
Если человек программист, то это надолго.
Re: Управление потоками
От: Dimka Россия  
Дата: 10.10.02 07:35
Оценка: 5 (1)
Здравствуйте the_moon, Вы писали:

TM>Привет,


TM> Мне кажется Sleep вставлять как-то не очень хорошее решение или это так и делается?

ну кстати это тоже вариант.
допустим можеш вызвать Sleep (0); для передачи управления какому нибудь другому потоку.
- нельзя впихать невпихуемое :)
Re[2]: Управление потоками
От: b_monkey Беларусь  
Дата: 10.10.02 07:43
Оценка:
Здравствуйте Dimka, Вы писали:

D>Здравствуйте the_moon, Вы писали:


TM>>Привет,


TM>> Мне кажется Sleep вставлять как-то не очень хорошее решение или это так и делается?

D>ну кстати это тоже вариант.
D>допустим можеш вызвать Sleep (0); для передачи управления какому нибудь другому потоку.
знаешь по-моему ты прав с точки зрения MS но на самом деле Sleep(1)(если потоки с одинаковыми приоритетами это точно и проверено),
если приоритеты разные, то тормозов и быть не должно
WBR,
vitaly voloshin
Re[2]: Управление потоками
От: the_moon  
Дата: 10.10.02 15:01
Оценка:
Здравствуйте achumack, Вы писали:

A>Здравствуйте the_moon, Вы писали:


A>

A>Посмотри fibers. Ето то что тебе нужно. Сам выбираешь время переключения.

Я тут читал, читал.

Тоесть я так понял, у меня есть основной поток в котором работает мое приложение, далее я создаю два потока и оба преобразуются в нити и запускаются функции по указанным адресам, а те функции как захотят так и передают управление друг другу.

Тогда я не понял следующию фразу "The system still schedules threads to run. When a thread running fibers is preempted, its currently running fiber is preempted. The fiber runs when its thread runs."

Вернее я понял, что система все таки продолжает переключать потоки, а это значит мне попрежнему надо синхронизировать данные, вот чего мне хотелось бы избежать и из-за чего у меня критичный поток тормозил на заметный промежуток времени, потому что он ждал у меня медленный поток, а потому не являлся готовым к запуску по определению в SDK.

И непонятно еще как мне определять размер стэка, как я могу быть уверенным, что мне хватит 1 мегабайта к примеру для DirectX, может он там чего огромное в стеке держит?

И еще, происходит ли сразу переключение на другую нить, то-есть наследует ли целевой поток тот квант времени, что оставался у потока, который вызвал SwitchToFiber, или просто этот поток будет на процессоре остановлен, а управление перейдет чужому дядьке?

А вообще конечно идея хорошая,
KOPOTbILLIKA KPbIC
Re[3]: Управление потоками
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.02 07:09
Оценка:
Здравствуйте b_monkey, Вы писали:

TM>>>Привет,


D>>допустим можеш вызвать Sleep (0); для передачи управления какому нибудь другому потоку.

BM>знаешь по-моему ты прав с точки зрения MS но на самом деле Sleep(1)(если потоки с одинаковыми приоритетами это точно и проверено),
BM>если приоритеты разные, то тормозов и быть не должно

Sleep(1) на самом деле Sleep(минимальный квант времени ~~ 10мс)
И потому разницы нет между Sleep(0) и Sleep(1)
Re[4]: Управление потоками
От: the_moon  
Дата: 11.10.02 08:11
Оценка:
Здравствуйте old Dutchman, Вы писали:

OD>Здравствуйте b_monkey, Вы писали:


TM>>>>Привет,


D>>>допустим можеш вызвать Sleep (0); для передачи управления какому нибудь другому потоку.

BM>>знаешь по-моему ты прав с точки зрения MS но на самом деле Sleep(1)(если потоки с одинаковыми приоритетами это точно и проверено),
BM>>если приоритеты разные, то тормозов и быть не должно

OD>Sleep(1) на самом деле Sleep(минимальный квант времени ~~ 10мс)

OD>И потому разницы нет между Sleep(0) и Sleep(1)

В толкователе жизни написанно, что Sleep(0) это передача управления потоку с таким же приоритетом, и если нету потока готового к запуску, то поток вызывавший Sleep(0) продолжает свою работу.
KOPOTbILLIKA KPbIC
Re[5]: Управление потоками
От: b_monkey Беларусь  
Дата: 11.10.02 08:46
Оценка:
Здравствуйте the_moon, Вы писали:

TM>Здравствуйте old Dutchman, Вы писали:


TM>В толкователе жизни написанно, что Sleep(0) это передача управления потоку с таким же приоритетом, и если нету потока готового к запуску, то поток вызывавший Sleep(0) продолжает свою работу.



проверка не займёт много времени
это я уже когда-то писал: создай два потока с бесконечными циклами типа while (1){Sleep(0);}// (приоритеты у потоков равны)
и посмотри что будет
а потом поставь 1 вместо 0 -- и опять посмотри )) -- мне тоже очень понравился результат,( но в MSDN-е написано что нужен 0)
WBR,
vitaly voloshin
Re[2]: Управление потоками
От: MaximE Великобритания  
Дата: 11.10.02 08:51
Оценка:
A>Посмотри fibers. Ето то что тебе нужно. Сам выбираешь время переключения.

Это же эмуляция для упрощения портирования Unix приложений.

Еще есть такая функция SwitchToThread.
Re[5]: Управление потоками
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.02 08:56
Оценка:
Здравствуйте the_moon, Вы писали:

D>>>>допустим можеш вызвать Sleep (0); для передачи управления какому нибудь другому потоку.

BM>>>знаешь по-моему ты прав с точки зрения MS но на самом деле Sleep(1)(если потоки с одинаковыми приоритетами это точно и проверено),
BM>>>если приоритеты разные, то тормозов и быть не должно

OD>>Sleep(1) на самом деле Sleep(минимальный квант времени ~~ 10мс)

OD>>И потому разницы нет между Sleep(0) и Sleep(1)

TM>В толкователе жизни написанно, что Sleep(0) это передача управления потоку с таким же приоритетом, и если нету потока готового к запуску, то поток вызывавший Sleep(0) продолжает свою работу.


Ничего подобного !

Parameters
dwMilliseconds
[in] Specifies the time, in milliseconds, for which to suspend execution. A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution. A value of INFINITE causes an infinite delay.
Re[6]: Управление потоками
От: b_monkey Беларусь  
Дата: 11.10.02 09:12
Оценка:
Здравствуйте old Dutchman, Вы писали:

OD>Ничего подобного !


OD>Parameters

OD>dwMilliseconds
OD>[in] Specifies the time, in milliseconds, for which to suspend execution. A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution. A value of INFINITE causes an infinite delay.


а ты пробовал??
[/code]
DWORD WINAPI FirstThread(LPVOID lpParameter);
DWORD WINAPI SecondThread(LPVOID lpParameter);

int main(int argc, char* argv[])
{
DWORD ThId;
HANDLE h;
CreateThread(0, 0, FirstThread, 0, 0, &ThId);
h = CreateThread(0, 0, FirstThread, 0, 0, &ThId);
getch();
return 0;
}
DWORD WINAPI FirstThread(LPVOID lpParameter)
{
while(1) Sleep(0);
}
DWORD WINAPI SecondThread(LPVOID lpParameter)
{
while(1) Sleep(0);
}
[/code]
посмотри сколько жрёт проца -- у меня на 1.4 гигагерца не меньше 90 процентов
а потом поставь Sleep(1);
WBR,
vitaly voloshin
Re[7]: Управление потоками
От: VVL  
Дата: 11.10.02 10:23
Оценка:
Здравствуйте b_monkey, Вы писали:


BM>DWORD WINAPI FirstThread(LPVOID lpParameter)

BM>{
BM> while(1) Sleep(0);
BM>}
BM>DWORD WINAPI SecondThread(LPVOID lpParameter)
BM>{
BM> while(1) Sleep(0);
BM>}
BM>посмотри сколько жрёт проца -- у меня на 1.4 гигагерца не меньше 90 процентов
BM>а потом поставь Sleep(1);

Так такой код и должен загружать проц. т.к. задежки нет и происходят только переключения.
А при Sleep(1) оба треда могут спать одновременно. Так что Sleep(0)!=Sleep(1) !!!
Re[8]: Управление потоками
От: b_monkey Беларусь  
Дата: 11.10.02 10:48
Оценка:
Здравствуйте VVL, Вы писали:

Sleep(0)!=Sleep(1) !!!
TRUE, TRUE
WBR,
vitaly voloshin
Re[3]: Управление потоками
От: the_moon  
Дата: 11.10.02 12:24
Оценка:
Здравствуйте MaximE, Вы писали:

A>>Посмотри fibers. Ето то что тебе нужно. Сам выбираешь время переключения.


ME>Это же эмуляция для упрощения портирования Unix приложений.


ME>Еще есть такая функция SwitchToThread.


Не, но хорошая эмуляция, можно прыгать в пределах одного потока туда сюда и настраивать легче.
KOPOTbILLIKA KPbIC
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.