Загрузка анимации экрана с использованием потоков

#c #multithreading #loading

#c #многопоточность #Загрузка

Вопрос:

Я создал игру, она написана на C и DirectX.

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

Мой вопрос заключается в следующем:

  1. Если происходит сбой одного потока (основного), происходит ли сбой всех потоков этого процесса?

  2. Можете ли вы уничтожить поток из потока, который его создал, или поток должен завершить себя?

  3. Я новичок в многопоточности и не использовал ее раньше. Многие люди говорят, что это делает программы излишне сложными, так стоит ли делать мою программу многопоточной только для экрана загрузки или есть другой способ сделать это?

Ответ №1:

Если происходит сбой одного потока (основного), происходит ли сбой всех потоков этого процесса?

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

Можете ли вы уничтожить поток из потока, который его создал, или поток должен завершить себя?

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

Я новичок в многопоточности и не использовал ее раньше. Многие люди говорят, что это делает программы излишне сложными, так стоит ли делать мою программу многопоточной только для экрана загрузки или есть другой способ сделать это?

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

Ответ №2:

Если происходит сбой одного потока (основного), происходит ли сбой всех потоков этого процесса?

Если под «сбоем» вы подразумеваете, что необработанное исключение передается в операционную систему — Да.

Можете ли вы уничтожить поток из потока, который его создал, или поток должен завершить себя?

Есть TerminateThread , но использовать его не рекомендуется. Лучше уведомить поток о том, что он должен завершиться, и оставить фактическую очистку потоку.

Я новичок в многопоточности и не использовал ее раньше. Многие люди говорят, что это делает программы излишне сложными, так стоит ли делать мою программу многопоточной только для экрана загрузки или есть другой способ сделать это?

Экран загрузки на самом деле является хорошим примером многопоточности. Однако я бы не стал создавать дополнительный поток для отображения вашего экрана загрузки, а скорее использовал бы несколько потоков для потоковой передачи ваших ресурсов. Рендеринг должен выполняться одним потоком (это обычно рекомендуется для всех версий DirectX).

Комментарии:

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

2. Я бы позволил моему основному потоку выполнять рендеринг в замкнутом цикле, в то время как другие потоки загружали бы ресурсы и сигнализировали, когда они будут выполнены, и в этом случае основной поток продолжил бы.