Высокая загрузка процессора. C ++ / SFML - PullRequest
0 голосов
/ 03 мая 2019

Моя программа загружает процессор на 80%. Некоторое время назад у меня была такая же проблема с GPU, я решил ее по таймеру. Загрузка процессора составляла около 50-60%, а сейчас - 80%. Что я сделал не так? Я не могу решить эту проблему.

#include <fstream>
#include <SFML/Graphics.hpp>
#include <ctime>
using namespace std;
char * readFile(char * filePath, unsigned int &lengthBuffer, fstream &f) {
    f.open(filePath, ios::in | ios::app | ios::binary);
    f.seekg (0, f.end);
    lengthBuffer = f.tellg();
    f.seekg (0, f.beg);
    char * fileBuffer = new char[lengthBuffer];
    f.read(fileBuffer, lengthBuffer);
    f.close();
    return fileBuffer;
}
char * writeFile(char * fileBuffer, char * filePath, unsigned int &lengthBuffer, fstream &f, bool &fileCreated){
    filePath[23] += 1;
    f.open(filePath, ios::out | ios::app | ios::binary);
    f.write(fileBuffer, lengthBuffer);
    filePath[23] -= 1;
    fileCreated = 1;
    f.close();
    return fileBuffer;
}

void removeFile(char * filePath, bool &fileCreated) {
    filePath[23] += 1;
    remove(filePath);
    filePath[23] -= 1;
    fileCreated = 0;
}
unsigned int mouse(unsigned int &funcSelector, bool &mouseLeft, sf::RenderWindow &window) {
    mouseLeft = sf::Mouse::isButtonPressed(sf::Mouse::Left);
    sf::Vector2i mouse = sf::Mouse::getPosition(window);
    if (mouseLeft & mouse.y < 100) {
        funcSelector = 1 + mouse.x/100;
    }
    return funcSelector;
}
int main(){
    sf::RenderWindow window(sf::VideoMode(500, 400), "COT++", sf::Style::Titlebar);
    sf::VertexArray points(sf::Points, 3000);
    sf::Event event;
    fstream f;
    bool mouseLeft, fileCreated = 0;
    unsigned int n = 0, funcSelector = 0, lengthBuffer = 0;
    float start = 0, now = 0, x = 0.f, y = 1.f, pos = 0.f;
    char * fileBuffer, filePath[30] = "c:/users/79994/desktop/a.exe";
    while (x < 500.f){
        points[n].position = sf::Vector2f(x + pos, y + pos);
        points[n].color = sf::Color::Green;
        x += 1.f;
        n += 1;
        if (x == 500.f & y < 100.f){
            x = 0.f;
            y += 100.f;
        }
    }
    x = 100.f, y = 1.f;
    while (x < 600.f){
        points[n].position = sf::Vector2f(x + pos, y + pos);
        points[n].color = sf::Color::Green;
        y += 1.f;
        n += 1;
        if (y > 101.f){
            x += 100.f;
            y = 1.f;
        }
    }
    while (window.isOpen())
    {
        while (window.pollEvent(event)) {
            if((clock()-start) > 50){
            start = clock();
            switch(funcSelector){
                case 5: window.close();
                break;
                case 1: if (lengthBuffer == 0){
                    fileBuffer = readFile(filePath, lengthBuffer, f);
                }    
                break;
                case 2: if (lengthBuffer > 0 & fileCreated == 0) {
                    writeFile(fileBuffer, filePath, lengthBuffer, f, fileCreated);
                }
                break;
                case 3: removeFile(filePath, fileCreated);  
                break;
            }
            mouse(funcSelector, mouseLeft, window);
            window.clear();
            window.draw(points);
            window.display();
        }
    }
    }
    return 0;
}

P.S. «Похоже, ваш пост в основном состоит из кода; пожалуйста, добавьте еще несколько деталей», - думаю, я описал достаточно деталей.

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

Это зависит от того, что вы хотите сделать.Для приведенного вами простого примера вы можете использовать waitEvent вместо pollEvent.Я рекомендую проверить, соответствует ли waitEvent вашим потребностям, но похоже, что так и будет.

Однако, если вы настаиваете на использовании pollEvent, продолжайте читать!

Ваша петля while(window.pollEvent(event))работает на полной скорости 100% времени, безостановочный опрос, даже если кажется, что ваша цель - «выполнять работу» каждые 50 часов.(Часы не всегда соотносятся с реальными единицами измерения, за исключением CLOCKS_PER_SEC, , который определяется реализацией ... и std::clock, может не соответствовать времени стены ... и CLOCKS_PER_SEC может быть жестко закодировано до 1 миллиона, когда это не имеет значащего значения ... но я отвлекся. Ваша проблема будет существовать независимо от того, как вы отслеживаете время для написанного кода, хотя вам может потребоваться какой-то другой механизм синхронизации.)

Вот возможное решение с минимальными изменениями в вашем коде.Замените:

    while (window.pollEvent(event)) {
        if((clock()-start) > 50){

следующим:

    while (window.pollEvent(event)) {
        const auto delta = clock() - start;
        if (delta < 50) {
          std::this_thread::sleep_for(std::chrono::microseconds(
            static_cast<int>(1E6 * (50 - delta) / CLOCKS_PER_SEC)));
        } else {

Вместо этого постоянно вместо вызова window.pollEvent(event) он будет вызывать его, поспать немного, если потребуетсязатем сделайте некоторую работу.

У этого подхода есть и недостатки, но он должен помочь вам начать думать о проблеме.

Вам понадобится #include <chrono> а также (или вы можете найти какой-нибудь другой способ спать в течение почти правильного периода времени, если вы не используете C++11 или более позднюю версию).

0 голосов
/ 03 мая 2019

Более или менее сложно и неточно пытаться угадать, просто взглянув на свой код. Вы должны попытаться профилировать свой код с помощью профилировщика.

PS: у вас также есть утечка памяти в «readFile» и «writeFile», когда вы выделяете буфер, но никогда не освобождаете его снова.

char * readFile(char * filePath, unsigned int &lengthBuffer, fstream &f) {
    // [...]
    char * fileBuffer = new char[lengthBuffer];
    // here you allocated memory on the heap, but you'll never free it.
    // [...]
    return fileBuffer;
}

Я бы также сказал, что вообще не используйте эти динамические Char-Arrays и C-Files. Просто используйте std :: string и std :: ostream. ostream работает с большим количеством STL и со строками, вам не нужно заботиться об использовании памяти и возможных утечках памяти. Он убирает за собой вместо массивов символов.

...