Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

Программирование на C#, многопоточность. Требуется сделать паузу для игры на WPF. Очень нужна помощь

Создаю игру на WPF при помощи языка C#. Требуется остановить выполнение всех действий при нажатии паузы. То есть, в Window1 начинается выполнение потока mainthread, который описывает действие Logic.Run . Сейчас там находится цикл, но это только для проверки, так что проверка состояния какой-то переменной не пойдет. Надо чтобы при открытии окна Close в основном потоке все остальные потоки (не исключено что их будет больше) останавливались. Вот нужные части кода:

//Окно паузы Close:
public partial class Close : Window
{
Window1 window1;
public Close(Window1 window1)
{
InitializeComponent();
this.window1 = window1;
window1.Hide();
KeyDown += new KeyEventHandler(HandleEsc);
}
private void HandleEsc(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
window1.Show(); //Нужно чтобы вот тут все потока продолжали выполняться как и было до паузы
Close();
}
}
}

//Основное окно Window1:
public partial class Window1 : Window
{
public static Window1 Wind;
public static Thread mainthread; //Нужно чтобы этот и другие (еще не созданные) потоки останавливались
public string Level { get { return (string)level.Content; } set { level.Content = value; } }
public Window1()
{
InitializeComponent();
Wind = this;
mainthread = new Thread( Logic.Run );
mainthread.Start(this);
}
private void HandleEsc(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
new Close(this); //При вызове данной строки, надо остановить все другие потоки
}
}
}

//Класс логики игры Logic (здесь будет вся логика, а не цикл wile, если что)
internal static class Logic
{
private static Window1 window1;
private static int a = 0;
static Logic()
{
window1 = Window1.Wind;
mainthread = Window1.mainthread;
}
public static void Run(object w)
{
while (true)
{
a++;
window1.Dispatcher.Invoke(() =>
{
window1.Level = a.ToString();
});
Thread.Sleep(1000);
}
}
}

Прошу хотя бы посоветовать что-нибудь, а то я полазил и попробовал и ThrowIfCancellationRequested() и lock - не очень понимаю, почему при нём все равно продолжается выполнение и т. д. Помогите, буду очень благодарен.

По дате
По рейтингу
Аватар пользователя
Искусственный Интеллект

\есть еще такой вариант, кроме флагов и CancellationToken

надо проверять самому


123456789101112131415161718192021222324252627282930313233343536373839404142
 internal static class Logic  
{  
    private static Window1 window1;  
    private static int a = 0; 
    private static ManualResetEvent pauseEvent = new ManualResetEvent(true); // ManualResetEvent для паузы 
 
    static Logic()  
    {  
        window1 = Window1.Wind;  
        mainthread = Window1.mainthread;  
    }  
 
    public static void Run(object w)  
    {  
        while (true)  
        {  
            a++;  
            window1.Dispatcher.Invoke(() =>  
            {  
                window1.Level = a.ToString();  
            });  
 
            // Ждем сигнала для продолжения выполнения 
            pauseEvent.WaitOne(); 
 
            Thread.Sleep(1000);  
        }  
    } 
 
    // Метод для приостановки выполнения 
    public static void Pause() 
    { 
        pauseEvent.Reset(); 
    } 
 
    // Метод для возобновления выполнения 
    public static void Resume() 
    { 
        pauseEvent.Set(); 
    } 
} 
 
12345678910
 private void HandleEsc(object sender, KeyEventArgs e)  
{  
    if (e.Key == Key.Escape)  
    {  
        Logic.Pause(); // Пауза 
        new Close(this);           
        Logic.Resume(); // Возобновление 
    }  
}