Страница: 1 |
|
Вопрос: Нужна помощь с Thread...
|
Добавлено: 02.09.04 03:53
|
|
Автор вопроса: Oleg K
|
VB.NET 2003
Помогите кто может. Что-то я совсем заморочился.
Мне надо найти решение, чтобы новый поток не запускался, пока не завершится предыдущий.
Надо обязательно, чтобы потоки выполнялись по очереди - один за другим.
Запускаю последовательно 7 (семь) процессов (задач) из одного диалога, здесь же необходимо выводить показатели затраченного времени на выполнение для каждого и еще один общий. Показатель времени с точностью до милисекунды.
Я пытаюсь использовать:
autoResetEvent1 = New Threading.AutoResetEvent(False)
Dim callback As New Threading.WaitOrTimerCallback(AddressOf Calculate)
Threading.ThreadPool.RegisterWaitForSingleObject(autoResetEvent1, _
callback, _
Nothing, _
Threading.Timeout.Infinite, _
False)
Дальше ясно, что Thread ждет autoResetEvent1.Set() - это все работает, но я ни как не могу "допереть", как мне ими управлять...
Подскажите пожалуйста...
Ответить
|
Номер ответа: 3 Автор ответа: Oleg K
Вопросов: 15 Ответов: 72
|
Профиль | | #3
|
Добавлено: 03.09.04 03:08
|
1. Есть семь задач, которые выполняют математику на SQL Server...
2. Есть "смопальный" контрол, который по сути является счетчиком времени (свойства Старт, Стоп и Обнулить) и отображает время 00:00:00.00 (до милисекунд)
3. Семь этих контролв-счетчиков лежат на форме.
Дальше необходимые действия
1. Запускаю первый счетчик (1) - он должен будет показать общее время выполнения всех задач
2. Стартую второй счетчик (2) и вместе с ним первую задачу
3. Задача отрабатывает - останавливаю второй счетчик (2)
4. Стартую третий счетчик (3) и вместе с ним вторую задачу
5. Вторая задача отрабатывает - останавливаю третий счетчик (3)
6 ... и т.д. все задачи
7. По окончанию всех хадач останавливаю первый счетчик (1)
Условия:
1. Не известно заранее время выполнения любой из задач.
2. При выполнении всех задач, форма должна быть свободна, чтобы счетчики могли отображать время
3. Выполнение задач обязательно в определенной последовательности одна за другой. По принципу - вторая не стартует, пока не отработает первая и т.д.
4. Все это должно работать в автомате (все задачи беспрерывно одна за другой) по нажатии одной кнопки, типа "Пуск" или "Старт"
5. Моя попытка предложить другой вариант решения, типа - печать результатов в лог файл, а потом его показывать и др. - была отвергнута и требование однозначно, только на форме, отражение результатов в реальном времени. Отсюда и контрол-счетчик.
Мои попытки:
1. Для работы с Thread соорудил класс:
Imports System
Imports System.Threading
Public Class RunProcess
 im Counter As Object
 im _state As Boolean = False
 im _RunComplite As Boolean = False
'Public state As Boolean
Private autoResetEvent1 As Threading.AutoResetEvent
Public Sub New(ByVal obj As Object)
Counter = obj
WaitForAutoEvent()
End Sub
Public Property autoResetEv() As Boolean
Get
Return _state
End Get
Set(ByVal Value As Boolean)
_state = Value
If _state = True Then
CType(Counter, Emerald.CounterWTime).Action(Emerald.CounterWTime.StateAction.Runing)
autoResetEvent1.Set()
End If
End Set
End Property
Public Property RunComplite() As Boolean
Get
Return _RunComplite
End Get
Set(ByVal Value As Boolean)
_RunComplite = Value
If RunComplite = True Then
CType(Counter, Emerald.CounterWTime).Action(Emerald.CounterWTime.StateAction.Complited)
End If
End Set
End Property
Private Sub WaitForAutoEvent()
autoResetEvent1 = New Threading.AutoResetEvent(False)
 im callback As New Threading.WaitOrTimerCallback(AddressOf Calculate)
Threading.ThreadPool.RegisterWaitForSingleObject(autoResetEvent1, _
callback, _
Nothing, _
Threading.Timeout.Infinite, _
False)
End Sub
Private Sub Calculate(ByVal obj As Object, ByVal TimedOut As Boolean)
If CType(Counter, Emerald.CounterWTime).Name = "CWT_NoCalc" Then
Threading.Thread.CurrentThread.Sleep(2000)
Threading.Thread.CurrentThread.Join()
RunComplite = True
ElseIf CType(Counter, Emerald.CounterWTime).Name = "CWT_NoKnow" Then
Threading.Thread.CurrentThread.Sleep(5000)
Threading.Thread.CurrentThread.Join()
RunComplite = True
ElseIf CType(Counter, Emerald.CounterWTime).Name = "CWT_UTEL" Then
Threading.Thread.CurrentThread.Sleep(3000)
Threading.Thread.CurrentThread.Join()
RunComplite = True
ElseIf CType(Counter, Emerald.CounterWTime).Name = "CWT_TarifAccount" Then
Threading.Thread.CurrentThread.Sleep(5500)
Threading.Thread.CurrentThread.Join()
RunComplite = True
ElseIf CType(Counter, Emerald.CounterWTime).Name = "CWT_ResultTarifAccount" Then
Threading.Thread.CurrentThread.Sleep(4000)
Threading.Thread.CurrentThread.Join()
RunComplite = True
End If
End Sub
End Class
По кнопке "Выполнить" на форме:
'Запустим процессы в режиме ожидания
 im CCWT_NoCalc As New RunProcess(CWT_NoCalc)
 im CCWT_NoKnow As New RunProcess(CWT_NoKnow)
 im CCWT_UTEL As New RunProcess(CWT_UTEL)
 im CCWT_TarifAccount As New RunProcess(CWT_TarifAccount)
 im CCWT_ResultTarifAccount As New RunProcess(CWT_ResultTarifAccount)
После этого все процессы запущены и находятся (если так можно выразиться) в режиме ожидания.
А ждут они - autoResetEvent1.Set()
И у меня есть возможность дать любому из них (из запущенных Процессов) такую команду через свойство класса autoResetEv.
И при запуске одного потока или всех сразу все это работает, а вот чтобы запустить их по-очереди, один за другим у меня и при этом чтобы лни не пблокировали друг друга или форму у меня не получается...
Ответить
|
Страница: 1 |
Поиск по форуму