Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2010, 15:47   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Theard - Cpu usage :)

Доброго времени суток уважаемые форумчане, у меня возникла маленькая проблемка, а проблемка заключается в следующем, при использование потока, нагрузка на процессор увеличивается с 20% до 80%, что не есть очень хорошо, вот собственно код.
Собственно как эту нагрузку уменьшить, как этот поток остановить после того как я проверю данные из файла? Пробовал и Sleep'ом и как только не извращался, но почему-то не помогло


Код:
#include "..."

DWORD WINAPI Timer(LPVOID lpParam)
{	
    Sleep(3000); 
    QuestSystem.d_LOAD("..\\Settings\\QuestSystem.ini");
    return 1;	
} 

extern "C" _declspec(dllexport) void Initialize()
{
    DWORD OldProtect;
	
    if(VirtualProtect(LPVOID(0x401000), 3543191, PAGE_EXECUTE_READWRITE, &OldProtect))
    {
        QuestSystem.Initialize();
                
	CloseHandle(CreateThread(NULL, 0, Timer, NULL, 0, NULL));

	_asm
	{
	    Mov DWord Ptr Ds:[00600060H], Offset ProtocolServer
	    Mov DWord Ptr Ds:[00600064H], Offset ProtocolClient
	}

	HookThis((DWORD)&ProtocolCore, 0x00403314);
    }
    else
    {
	MessageBoxA(NULL, "Could not begin the dll", "MyDLL.dll", MB_OK);
    }
}

Последний раз редактировалось coNsept; 17.07.2010 в 15:54.
coNsept вне форума Ответить с цитированием
Старый 17.07.2010, 17:23   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Проблему исправил, топик можно удалить, либо закрыть. (Может кому и пригодится)

Код:
#include "..."

void UpdateQuestListThread()
{
    while ( TRUE )
    {
	Sleep(60000);
	QuestSystem.d_LOAD("..\\Settings\\QuestSystem.ini"); 
    }
}

extern "C" _declspec(dllexport) void Initialize()
{
    DWORD OldProtect;
	
    if(VirtualProtect(LPVOID(0x401000), 3543191, PAGE_EXECUTE_READWRITE, &OldProtect))
    {
        QuestSystem.Initialize();
            
	CreateThread(NULL, NULL, LPTHREAD_START_ROUTINE(UpdateQuestListThread), NULL, 0, 0);

	_asm
	{
	    Mov DWord Ptr Ds:[00600060H], Offset ProtocolServer
	    Mov DWord Ptr Ds:[00600064H], Offset ProtocolClient
	}

	HookThis((DWORD)&ProtocolCore, 0x00403314);
    }
    else
    {
	MessageBoxA(NULL, "Could not begin the dll", "MyDLL.dll", MB_OK);
    }
}

Последний раз редактировалось coNsept; 17.07.2010 в 17:27.
coNsept вне форума Ответить с цитированием
Старый 18.07.2010, 02:22   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Кстати, если уж на то пошло, то передаваемая в CreateThread функция должна иметь тип, как в первом примере. Ибо могут быть ошибки во время выполнения на 64-х битных виндах.
Код:
DWORD WINAPI UpdateQuestListThread(LPVOID)
netrino вне форума Ответить с цитированием
Старый 19.07.2010, 07:48   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Ага, так уже и сделал, и поток послал спать на веке веков :D (пасябкин)
А мой второй пример, кстати тоже не правильный, так как поток ожидал всего 1 минуту и далее уходил в процедуру, опять же нагружая процесор... Новый вариант, все работает как часы

Код:
void SleepThread(void * lpParam)
{
	while(true)
	{
		Sleep(60000);
	}
	_endthread();
}

DWORD WINAPI Timer(LPVOID lpParam)
{	
	Sleep(4100);
	//ItemDropRate(0, 0, "..\\Settings\\ItemDropRate.txt");
	QuestSystem.Load("..\\Settings\\QuestSystem.ini");
	_beginthread(SleepThread, 0, NULL );
	return 1;
}

extern "C" _declspec(dllexport) void Initialize()
{
	DWORD OldProtect;

	if(VirtualProtect(LPVOID(0x401000), 3543191, PAGE_EXECUTE_READWRITE, &OldProtect))
	{
	
		QuestSystem.Initialize();
		//ItemDropRate(0, 0, "..\\Settings\\ItemDropRate.txt");

		CloseHandle(CreateThread(NULL, NULL, LPTHREAD_START_ROUTINE(Timer), NULL, 0, 0));

		_asm
		{
			Mov Dword Ptr Ds:[00600060H],Offset ProtocolServer
			Mov Dword Ptr Ds:[00600064H],Offset ProtocolClient
		}

		HookThis((DWORD)&ProtocolCore, 0x00403314);
		HookThis((DWORD)&ProtocolCoreSend,0x0040533F);
		HookThis((DWORD)&MonsterDropCall, 0x00404E4E);
	}
	else
	{ MessageBoxA(NULL, "Could not begin the dll", "MyDLL.dll", MB_OK); }
}

Последний раз редактировалось coNsept; 19.07.2010 в 07:52.
coNsept вне форума Ответить с цитированием
Старый 19.07.2010, 14:06   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну, чтобы усыпить поток, не обязательно цикл делать, можно просто Sleep (INFINITE);
А вообще зачем это вам? Вы запускаете отдельный поток только для того чтобы он спал, в этом есть резон?
netrino вне форума Ответить с цитированием
Старый 20.07.2010, 08:52   #6
Teksa
Пользователь
 
Регистрация: 24.08.2007
Сообщений: 88
По умолчанию

если честно не понял зачем "спящий красавец" рожается.
Цитата:
как этот поток остановить после того как я проверю данные из файла
TerminateThread()
Teksa вне форума Ответить с цитированием
Старый 21.07.2010, 19:53   #7
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

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

Цитата:
Ну, чтобы усыпить поток, не обязательно цикл делать, можно просто Sleep (INFINITE);
Спасябки

Последний раз редактировалось coNsept; 21.07.2010 в 19:58.
coNsept вне форума Ответить с цитированием
Старый 22.07.2010, 16:55   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от coNsept Посмотреть сообщение
Данные функций в функции Timer обновляются по изменению значений установленных в определенном файле, поэтому чтобы не перезапускать программу, что не очень желательно, данные должны обновляться, как бы в режиме реального времени, после чего я отправляю этот поток спать дабы не грузить процессор. Вот и весь компот


Спасябки
Но зачем отправлять его спать, если по выполнению всех действия и выходу из callback-функции поток завершается?..
И как оно обновляет в реальном времени, если поток спит? Или вы каждый раз запускаете поток из основного? В таком случае тем более нельзя отправлять поток спать не давая ему завершится, иначе, со временем, программа может превысить лимит потоков.
netrino вне форума Ответить с цитированием
Старый 23.07.2010, 12:00   #9
Teksa
Пользователь
 
Регистрация: 24.08.2007
Сообщений: 88
По умолчанию

после Sleep(дофига); поток уже ничего не будет делать...
Код:
void SleepThread(void * lpParam)
{

	while(true) //этот самый слип(дофига) отсюда поток уже не выйдет и ничего полезного не сделает..
	{
		Sleep(60000);
	}
	_endthread();
}
так и не понял зачем СлипФриад он стартует в процедуре таймер, входит в бесконечный цикл в котором отдает процессор на интервал от 60000 и так while (true).

в результате в функции Timer также запускающейся в отдельном потоке мы ждем 4100 мс, грузим файлик и начинаем новый бесконечный поток... при этом поток Timer умирает с криком "1"...

если цель - точное измерение времени то мне тут хорошую вещь подсказали: timeSetEvent(); позволяет устанавливать точность.

зы, а всетаки какие данные изменяет спящий поток, он ж даже при инициализации ничего не делает, только изредка захватывает проц?
Teksa вне форума Ответить с цитированием
Старый 23.07.2010, 13:22   #10
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Цитата:
Или вы каждый раз запускаете поток из основного?
Да, именно так, а на счет лимита я небыл в курсе...

Вот что получилось

Код:
// ----

void SleepThread(void * lpParam)
{
	TerminateThread(SleepThread, 1); 
        // ----
        Sleep(INFINITE);
}

DWORD WINAPI Timer(LPVOID lpParam)
{	
	Sleep(4100);
	//ItemDropRate(0, 0, "..\\Settings\\ItemDropRate.txt");
	g_Quest.LoadFile(QUESTPATHTXT);
	_beginthread(SleepThread, 0, NULL );
	return 1;
}

// ----
Вот что я еще вычитал

Цитата:
TerminateProcess/TerminateThread - это самый крайний случай. Т.к. здесь есть шанс не только угробить открытые файлы, вызвать утечку памаяти и пр., но даже повесить систему.
п.с. - А так ребята, всем большое спасибо за помощь

Последний раз редактировалось coNsept; 23.07.2010 в 13:46.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CPU Thermometer in Win VISTA ongleb Общие вопросы C/C++ 1 26.05.2010 13:37
шейдеры в CPU (вопрос) Vodyanoi Свободное общение 2 25.03.2009 04:36
Программа для определения CPU netsky2004 Паскаль, Turbo Pascal, PascalABC.NET 0 10.01.2009 02:07
Не могу получить CPU speed TaTT DoGG Общие вопросы .NET 2 02.01.2009 17:20
Температура CPU vicvtor Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 12.05.2008 09:21