Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66
1

SFML(?) Зависающее окно

19.08.2015, 16:57. Просмотров 2223. Ответов 4
Метки нет (Все метки)

Есть программа. При нажатии на кнопке в основном меню запускается процедура для совершения определенного действия. Процедура работает некоторое время (сек 5-10), после чего окно становится "серым", и в титле написано "не отвечает".

Код процедуры
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
void create()
{
 
    while ((Mouse::isButtonPressed(Mouse::Left)))
    {
        //delay
    }
 
    Screen.setTexture(fonecreateT);
 
    Vector2f mXY;
 
    int n = 0;
 
    bool done = false;
 
    mWindow wSearch(46, 71, winB);
 
    while (!done)
    {
        window.clear();
        window.draw(Screen);
        window.display();
 
        LangAndCaps(); 
 
        mXY.x = Mouse::getPosition(window).x;
        mXY.y = Mouse::getPosition(window).y;
 
        wSearch.check();
 
        if (Mouse::isButtonPressed(Mouse::Left))
        {
            //
        }
 
        cout << "X:Y[" << mXY.x << ":" << mXY.y  << "] \ "  << "n[" << n << "] \ " << endl;
 
        if (Keyboard::isKeyPressed(Keyboard::Escape))
            done = true;
 
    }
 
    while (n != 0)
    {
        //delete loop
    }
 
}

Во время зависания в консоль не останавливает своей работы, все выводит нормально. Главное окно перестает считывать нажатия.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2015, 16:57
Ответы с готовыми решениями:

Не отвечает окно приложения SFML
Собрал приложение простой отрисовки круга. Запускаю exe, открывается приложение и просто висит,...

Одно окно под SFML и текст
Добрый день уважаемые программисты. Только что столкнулся с одним нюансом. Он заключается в том,...

SFML не появляется окно при запуске exe файла
Не появляется окно при запуске exe файла. Ни с release ни с debug. Ни с х64 ни с х86. Но если...

SFML окно, нету методов создания поля для ввода?
Вот понадобилось в окне поле для ввода, вот только где мне его найти, создавши консольный проект, и...

4
1339 / 982 / 309
Регистрация: 28.07.2012
Сообщений: 2,736
19.08.2015, 17:03 2
Цитата Сообщение от agent7991 Посмотреть сообщение
после чего окно становится "серым", и в титле написано "не отвечает".
Окно и твоя функция скорее всего работают в одном потоке.
Из-за чего, когда работает функция, то окно не может отвечать на сообщения, полученные от ОС,
из-за чего ОС помечает окно как не отвечающее.
0
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66
19.08.2015, 17:48  [ТС] 3
nonedark2008, до сего момента я не имел представления о понятии поток. Сейчас я прочитал краткие обобщенные понятия, и мне кажется что я понял ваш ответ. Но я не совсем понимаю, как могло получится что они работают в одном потоке?

И что мне делать в данном случае, как сказать системе выбрать другой поток?
0
1339 / 982 / 309
Регистрация: 28.07.2012
Сообщений: 2,736
19.08.2015, 18:32 4
Лучший ответ Сообщение было отмечено agent7991 как решение

Решение

Цитата Сообщение от agent7991 Посмотреть сообщение
И что мне делать в данном случае, как сказать системе выбрать другой поток?
У тебя при запуске приложения отдельно отображается консоль и окно?
Консоль работает в одном потоке, когда ты через SFML создаете окно, то там неявно создается новый поток под создаваемое окно. В этом потоке идет постоянная обработка сообщений от ОС (кнопку нажал - пришло сообщение, окно подвинул - пришло сообщение, нажал крестик - пришло сообщение). Наверняка при обработке одного из таких сообщений ты и вызываешь свою функцию. И пока она не закончит свою работу, сообщение не будет считаться обработанным и другие обрабатываться не будут. Это если кратко описывать.
Чтобы этого избежать, необходимо вызывать твою функцию в отдельном потоке, чтобы ее выполнение не прерывало выполнение обработчика сообщений окна.
Для запуска отдельного потока можно использовать std::thread, либо другой механизм.
1
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66
19.08.2015, 19:11  [ТС] 5
nonedark2008, все прекрасно и доходчиво объяснили. Спасибо.

Добавлено через 7 минут
//
В моем случае достаточно было добавить обработку событий, которые, если я таки понял правильно, являются потоками.
C++
1
2
3
4
5
6
7
8
    while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
 
//где window - заранее объявленный объект класса RenderWindow
//и event - заранее объявленный объект класса Event
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2015, 19:11

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

SFML в C::B пытается что-то найти в D:\sfml-release\ которого нет
Добрый день, вторые сутки пытаюсь подключить SFML библиотеку к C::B. При подключении по мануалу с...

D:\C++ Projekts\SFML\main.cpp [Error] SFML\Graphics.hpp: No such file or directory
Пытаюсь начать кодить на библиотеке SFML но при компиляции пучтого проэкта выдает ...

Не могу вставить фото в окно sfml (failed to load image "hero.png". Reason: Unable to open file)
Не могу вставить фото в окно sfml(failed to load image &quot;hero.png&quot;. Reason: Unable to open file)

Ошибка: CMake Error at deps/SFML/src/SFML/Window/CMakeLists.txt:106 (message): Xrandr library not found
Собсна, решил собрать библиотеку , столкнулся с непонятками, но потом дошло что не так, начал...

Создание релиза exe файла SFML C++ на VS 2017 (не удается открыть входной файл "sfml-graphics-s.lib")
не могу собрать решение релиз версии, не пойму что я делаю не так постоянно выдает ошибку 1&gt;LINK...

Создать окно произвольного размера, скрыть окно, показать окно, удалить окно.
Создать окно произвольного размера, скрыть окно, показать окно, удалить окно. Для создания окна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.