используя темы в опциях меню - PullRequest
0 голосов
/ 29 марта 2010

У меня есть приложение, в котором есть консольное меню с выбором 2/3. Один процесс включает загрузку файла и выполнение длительного процесса поиска его содержимого, тогда как другой процесс включает запросы SQL и является интерактивным процессом с пользователем. Я хочу использовать потоки, чтобы разрешить запуск одного процесса, и меню, предлагающее возможность запуска второго процесса. Однако вы не можете запустить первый процесс дважды. Я создал потоки и исправил некоторые ошибки компиляции, но параметры потоков не работают правильно. Любая помощь приветствуется.

main...

 Dim tm As Thread = New Thread(AddressOf loadFile)
 Dim ts As Thread = New Thread(AddressOf reports)

 ....
 While Not response.Equals("3")
            Try

                Console.Write("Enter choice: ")
                response = Console.ReadLine()
                Console.WriteLine()
                If response.Equals("1") Then
                    Console.WriteLine("Thread 1 doing work")
                    tm.SetApartmentState(ApartmentState.STA)
                    tm.IsBackground = True
                    tm.Start()
                    response = String.Empty
                ElseIf response.Equals("2") Then
                    Console.WriteLine("Starting a second Thread")
                    ts.Start()
                    response = String.Empty
                End If


                ts.Join()
                tm.Join()

            Catch ex As Exception
                errormessage = ex.Message

            End Try

        End While

Я понимаю, что на основе форм будет проще реализовать, возможно, просто вызывая различные формы для обработки процессов. Но у меня действительно нет такой опции сейчас, так как консольное приложение будет добавлено в API позже. Но вот мои два процесса из функций меню. Также не уверен, что делать с логическим переменным снова, как предложено ниже.

Private Sub LoadFile()

        Dim dialog As New OpenFileDialog
        Dim response1 As String = Nothing
        Dim filepath As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)



        dialog.InitialDirectory = filepath
        If dialog.ShowDialog() = DialogResult.OK Then
            fileName = dialog.FileName
        ElseIf DialogResult.Cancel Then
            Exit Sub
        End If


        Console.ResetColor()
        Console.Write("Begin Search -- Discovery Search, y or n? ")
        response1 = Console.ReadLine()
        If response1 = "y" Then
            Search()
        ElseIf response1 = "n" Then
            Console.Clear()
            main()
        End If

        isRunning = False
    End Sub

и второй

Private Shared Sub report()
        Dim rptGen As New SearchBlogDiscovery.rptGeneration
        Console.WriteLine("Tread Process started")
        rptGen.main()
        Console.WriteLine("Thread Process ended")
        isRunning = False
    End Sub

Ответы [ 2 ]

1 голос
/ 29 марта 2010

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

Свойство IsBackground просто сообщает операционной системе, что если основной поток закрыт, фоновые потоки закрываются автоматически.

Вот идея:

1) создать логическую переменную MyThreadRunning

2) если MyThreadRunning = true, не показывать пункт меню для этой темы

3) внутри метода потока, когда он завершит работу, установите для MyThreadRunning значение false

4) когда вы выбираете пункт меню, запускающий поток, установите для переменной MyThreadRunning значение true и запустите поток.

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

РЕДАКТИРОВАТЬ: мне действительно нужно посмотреть предварительный просмотр перед публикацией: (* ​​1017 *

1 голос
/ 29 марта 2010

Поскольку вы не описываете, что означает «не работает правильно», я не могу предоставить реальное решение. Я могу, однако, дать несколько советов:

  1. Если один из ваших процессов является интерактивным, это не выглядит хорошим кандидатом для асинхронной операции в консольном приложении. Хотя приложение WinForms или WPF может предоставить специальную форму для взаимодействия с этим процессом, окно консоли не может обеспечить такую ​​же изоляцию.
  2. Существует ли причина, по которой вы используете поток STA для операции 1?
  3. Также для операции 1, почему вы устанавливаете IsBackground в true? Фоновые потоки не будут препятствовать выходу процесса, поэтому, если процесс завершается во время выполнения потока, он просто уничтожает поток, не дожидаясь его завершения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...