Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Microsoft .NET

  Все выпуски  

RFpro.ru: Microsoft .NET


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Micren
Статус: Бакалавр
Рейтинг: 703
∙ повысить рейтинг »
Серг aka umbSSE
Статус: 10-й класс
Рейтинг: 266
∙ повысить рейтинг »
Evgenijm
Статус: 10-й класс
Рейтинг: 240
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Microsoft .NET

Номер выпуска:161
Дата выхода:30.08.2009, 00:35
Администратор рассылки:Alexey G. Gladenyuk, Управляющий
Подписчиков / экспертов:311 / 56
Вопросов / ответов:1 / 1

Вопрос № 171587: Здравствуйте! У меня вопрос по поводу Мультитрейдинга в C#. Я сделал программу, в которой есть два потока: интерфейс и мой. У меня проблема в том, что я не знаю, как можно приостановить поток (у меня ошибка типа "поток не выполняется и поэтом...



Вопрос № 171587:

Здравствуйте!
У меня вопрос по поводу Мультитрейдинга в C#. Я сделал программу, в которой есть два потока: интерфейс и мой. У меня проблема в том, что я не знаю, как можно приостановить поток (у меня ошибка типа "поток не выполняется и поэтому его нельзя приостановить, хотя он выполняется" - вызываю метод Suspend) и как его можно быстро (аварийно) завершить. Получается остановить поток, выйдя из цикла, т.е. когда заканчивается процедура, завершается поток. И еще: когда я пытаюсь закрыть форму при включенном потоке, то он мне пишет, что "доступа не уничтоженному объекту нет" - оно и понятно - этот объект - это форма, которую я уже закрыл, но как сделать так, чтобы при закрытии формы он завершал мой поток - вот, в чем вопрос...
Есть еще одна мелочь: дело в том, что, чтобы управлять потоком, я сделал "единый центр управления" - процедура Hand. Сделал я это только потому, что я не знаю, как сделать переменную, которая, через которую я управл яю потоком, глобальной.
Помогите новичку, пожалуйста! Причем, я новичок только в C#, я очень хорошо разбираюсь в VB и Delphi. Если Вы ответите хотя бы на один из этих вопросов, буду ОЧЕНЬЬ признателен!! :)
Вот ссылка на программу: Прога. Использую MS Visual Studio 2008.
ОГРОМНОЕ спасибо заранее, мне это ОЧЕНЬЬ важно! :)

Отправлен: 24.08.2009, 23:56
Вопрос задал: AkaProc, 5-й класс
Всего ответов: 1
Страница вопроса »


Отвечает Micren, Бакалавр :
Здравствуйте, AkaProc.
Вот архив с проектом.
http://rapidshare.com/files/271059407/WindowsThreading.rar
Код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsThreading
{
public partial class Form1 : Form
{
byte h = 0; bool b = true;
delegate void SetTextCallback(string text);

public Form1()
{
InitializeComponent();
}

private void startButton_Click( object sender, EventArgs e)
{
stopButton.Enabled = true;
startButton.Enabled = false;
pauseButton.Enabled = true;
// Запускаем поток
StartThread();
}

Thread worker;
bool suspend;

/// <summary>
/// Запускает поток
/// </summary>
private void StartThread()
{
// Создаем и запускаем фоновый поток
worker = new Thread(WriteY);
suspend = false;
worker.IsBackground = true;
worker.Start();
}

/// <summary>
/// Прерывает поток
/// </summary>
private void AbortThread()
{
if (worker != null)
{
try
{
worker.Abort();
worker.Join(); }
catch (ThreadStateException)
{
}
}
}

/// <summary>
/// Приостанавливает поток
/// </summary>
/// <returns></returns>
private bool SuspendThread()
{
if (worker != null)
{
if ((worker.ThreadState & ThreadState.Background) == ThreadState.Background)
{
if ((worker.ThreadState & ThreadState.Suspended) == ThreadState.Suspended)
{
worker.Resume();
suspend = false;
}
else
{
worker.Suspend();
suspend = true;
}
}
}
return suspend;
}

private void SetText(string text)
{
this.startButton.Text = text;
}

private void WriteY()
{
try
{
int max = 0;
while (b)
{
h += 1;
if (h > max) max = h;
if (this.startButton.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { h.ToString() + " Единиц." });
}
}
}
catch (ThreadAbortException)
{
}
}

private void timer1_Tick(object sender, EventArgs e)
{
p.Value = h;
}

private void stopButton_Click(object sender, EventArgs e)
{
stopButton.Enabled = false;
startButton.Enabled = true;
pauseButton.Enabled = false;< br> AbortThread();
}

private void pauseButton_Click(object sender, EventArgs e)
{
stopButton.Enabled = !SuspendThread();
}

/// <summary>
/// Вызывается при закрытии формы
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// Остановим поток
AbortThread();
}
}
}

Ваш поток действительно не выполняется и его нельзя завершить потому, что перед этим создаете новый поток в том же методе. Ошибка в логике работы программы.
Аварийно завершить поток можно методом Thread.Abort().
Перед закрытием формы следует завершить поток. Это можно сделать в обработчике события FormClosing.

Нельзя не сказать, что методы Suspend() и Resume() считаются устаревшими и их не рекомендуется использовать. Для синхронизации потоков используйте Mutex,Semaphore,Monitor, в общем, объекты из того же System.Threading.

Ответ отправил: Micren, Бакалавр
Ответ отправлен: 25.08.2009, 01:54

Оценка ответа: 5
Комментарий к оценке:
Огромное спасибо!
Отличный ответ!

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 253521 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.8 от 28.08.2009

    В избранное