Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замедление, функции 
:(
    Опции темы
OXOTHUK
Дата 16.8.2006, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Доброго времени суток.
Как можно замедлить выполнение функции? Мне надо чтобы выполнялась рекурсивная функция бесконечно(это несложно организовать), но чтоб при этом она не жрала вре ресурсы, чтобы ещё успевали выполняться обработка клавиш и 2 таймера без тормозов. Т.е. все работатет как всегда, только оставшиеся ресурсы идут в эту функцию.
Была идёя: я где-то слышал, что есть функция которая делает задержку в милисекундах, но не тормозит систему, эти ресурсы уходят в работу других задач. Какая эта функция(если кто помнит) и может ли она помочь?
PM MAIL   Вверх
DukeCpp
Дата 16.8.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 27.2.2006
Где: St.Petersburg

Репутация: нет
Всего: 1



Sleep(unsigned long);
PM   Вверх
Greeen
Дата 16.8.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: нет
Всего: 18



OXOTHUK, делай в отдельном потоке.
CreateThread


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
586
Дата 16.8.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(OXOTHUK @  16.8.2006,  21:16 Найти цитируемый пост)
 я где-то слышал, что есть функция которая делает задержку в милисекундах, но не тормозит систему, эти ресурсы уходят в работу других задач. Какая эта функция(если кто помнит) и может ли она помочь? 

может, WaitForSingleObject(GetCurrentProcess(), -1);
PM   Вверх
OXOTHUK
Дата 17.8.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Со слипом не получилось(как я идумал), он замедляет и выделяет ресурсы для других потоков, а не для функций и поэтому у меня вся прога стоит(она же один поток). Придётся делать через потоки.
Цитата(Greeen @  16.8.2006,  23:10 Найти цитируемый пост)
делай в отдельном потоке.
CreateThread

С потоками особо не работал(создать удалить), поэтому проесните:
1) Если я создам поток и укажу функцию(ThreadFunc), эта функция будет вертеться или один раз выполнится?
Если не будет:
2) Думал начать вызвать из ThreadFunc рекурсией ThreadFunc и между вызовами пусть будет Sleep, чтобы не высло, но подумал - и мне кажется что рано или поздно кончится стек?

Как ещё можно организовать?
PM MAIL   Вверх
Romikgy
Дата 17.8.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146





--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Artemon
Дата 17.8.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



На самом-то днлн все оченб просто:

Application->ProcessMessage();

smile

Просто вставь в свою рекурсивную функцию и все OK.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Romikgy
Дата 17.8.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Artemon, 
Цитата(Romikgy @  17.8.2006,  15:09 Найти цитируемый пост)
можно Sleep(0);

имхо делает тоже самое


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
OXOTHUK
Дата 17.8.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Так как выполняться моя рекурсивная функция должна паралельно моей проге я создал TThread. Там написал:
Код

//---------------------------------------------------------------------------
#ifndef CThreadDrawerH
#define CThreadDrawerH
#include <Classes.hpp>
#include "Main.h"
class CRealGDI;
//---------------------------------------------------------------------------
class CThreadDrawer : public TThread
{
  typedef struct tagTHREADNAME_INFO
  {
    DWORD dwType;     // must be 0x1000
    LPCSTR szName;    // pointer to name (in user addr space)
    DWORD dwThreadID; // thread ID (-1=caller thread)
    DWORD dwFlags;    // reserved for future use, must be zero
  } THREADNAME_INFO;
private:
  void SetName();
  CRealGDI *engine;
protected:
        void __fastcall Execute();
public:
        __fastcall CThreadDrawer(bool CreateSuspended);
        bool SetRealGDI(CRealGDI *Eng);
};
//---------------------------------------------------------------------------
#endif

Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "CThreadDrawer.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall CThreadDrawer::CThreadDrawer(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void CThreadDrawer::SetName()
{
        THREADNAME_INFO info;
        info.dwType = 0x1000;
        info.szName = "ThreadDrawer";
        info.dwThreadID = -1;
        info.dwFlags = 0;

        __try
        {
                 RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD),(DWORD*)&info );
        }
        __except (EXCEPTION_CONTINUE_EXECUTION)
        {
        }
}
//---------------------------------------------------------------------------
void __fastcall CThreadDrawer::Execute()
{
        SetName();
        while (!Terminated)
        {
                if (engine->DrawScene());
                else ShowMessage("Error! Can't present");
                Sleep(0);
        }
}
//---------------------------------------------------------------------------
bool CThreadDrawer::SetRealGDI(CRealGDI *Eng)
{
        if (Eng!=0)
        {
                engine = Eng;
                return true;
        }
        return false;
}
//---------------------------------------------------------------------------

Т.е. как видно здесь у меня игра. Я хочу чтобы всё было как у людей, чтобы были fps и они были на свободные ресурсы системы.
Так вот. Почему-то выполняется этот код всего несколько раз, а потом сам по себе перестаёт. Методом додагок, проб и ошибок(1 фатальная) я высянил что он прерывается каждый раз в абсолютно любое время(иногда номально выполняется пока кнопку не нажму, а иногда еле запуститься успеет.) Почему так может быть? Возможно я сделал какие-то ошибки свойственные новичкам в потоках? Хотя я вроде всё сделал как в той книге(которую Romikgy мне показал): создал процесс и вызвал резюм(хотя процесс я создал динамически), а в деструкторе формы прописал Terminate для потока.

Это сообщение отредактировал(а) OXOTHUK - 17.8.2006, 19:47
PM MAIL   Вверх
Artemon
Дата 17.8.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Цитата

Artemon, 

Цитата(Romikgy @  17.8.2006,  15:09 ) 
можно Sleep(0); 

имхо делает тоже самое 


Возможно, но это нигде не написано ( может ошибаюсь ).

ОХОТНИК, есть подозрение, что engine->DrawScene() - обращается к объектам vcl, если это так, то и для этого метода используй Synchronize

И обязательно посмотри сюда
http://www.forum.vingrad.ru/index.php?showtopic=108118


Это сообщение отредактировал(а) Artemon - 17.8.2006, 21:30


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
OXOTHUK
Дата 20.8.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Всё вроде работает, только тормозит. Я поставил для нового потока минимальную приоритетность, но всё равно для таймеров на форме не хватает и они чуть-чуть тормозят. Нельзя ли как-то повысить приоритет для главного потока?
PM MAIL   Вверх
Romikgy
Дата 20.8.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



я одного не понял .... у тя тормозило , ты вынес все в отдельный поток и обратно вызываешь его в синхронизации? так чего ты удивляешься торможению????
имхо синхронизация как раз и работает в основном потоке! в отдельные потоки надо выносить ф_ции где нет обращений VCL ! и сами синхронизации должны быть очень редкими (относительно)


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
OXOTHUK
Дата 20.8.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Не, у меня не тормозило, у меня вообще висело.
Да я понял, что во всем виновата синхронизация, но что тут сделаешь, у меня вообще нет функции без VCL. А мне надо во втором потоке отрисовывать Canvas->Draw, а в таймерах формы изменять координаты, загружать картинки, и др.
PM MAIL   Вверх
Romikgy
Дата 20.8.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Цитата(OXOTHUK @  20.8.2006,  13:56 Найти цитируемый пост)
Не, у меня не тормозило, у меня вообще висело.

это идентично , ты лучше определись что у тя забирает процессорное время, в твоей ф_ции? и вот этот кусок кидай в отдельный поток


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Artemon
Дата 20.8.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Если делать все по уму, то никаких тормозов не будет.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.