Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 28.02.2014
Сообщений: 43
1
.NET 4.x

Как из одной процедуры прервать выполнение другой?

14.04.2014, 20:12. Показов 2954. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно проблема возникла в следующем. Есть такая конструкция:
VB.NET
1
2
3
4
5
6
7
8
9
10
Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
        in_bd()
        For st = 1 To col_tabl
            in_file()
            run_prog()
            Timer2.Start() ' Run Script
            Timer1.Start() 'search excell and kill proj and files
            pc = pc + 1
        Next
    End Sub
внутри события Timer1_Tick есть условие:
VB.NET
1
2
3
 If trt >= 25.0 Then
                        Timer1.Stop()
             End If
как сделать, что бы в этом условии после остановки таймера происходил выход из Button9_Click а ни только из события Timer1_Tick
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2014, 20:12
Ответы с готовыми решениями:

В случае ошибки не прервать выполнение программы, а перейти к другой процедуре или к другому месту той же процедуры
Прошу помочь: в случае ошибки не прервать выполнение программы, а перейти к другой процедуре или к...

Как прервать выполнение процедуры?
Есть четыре процедуры, вызывающие одна другую. Они читают аксесовскую базу и строят дерево в...

Как прервать выполнение процедуры?
Ребят, подскажите пожалуйста, как остановить выполнение процедуры. В Паскале помню пользовались...

Как прервать выполнение процедуры на диалоге
Человек нажал кнопочку и запустился процесс. В моем случае это отправка почты. Пока идет дело...

10
Почетный модератор
21400 / 9134 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
14.04.2014, 20:32 2
Есть пара вариантов.
1) Завести булеву переменную глобально, в таймере устанавливать ей значение, если что-то пошло не так, например, в False.
В кнопке в определенном месте проверять, чему равна переменная, если все ок, идем дальше, если переменная стала False, то Exit Sub
2) Выполнять все проверки в одном методе.

Варианта вызвать Exit Sub для другого метода не знаю.

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

Вариант 3) Продумывать логику кода до того, как начал его писать, чтобы потом такие ситуации не заставляли искать решение, тем самым убивая полезное время
2
1 / 1 / 0
Регистрация: 28.02.2014
Сообщений: 43
15.04.2014, 17:45  [ТС] 3
написал с использованием переменной, но возник другой вопрос:
как дождаться момента, когда Timer1 остановится, что бы программа не выполнялась до тех пор, пока таймер не выключится в своем событии Tick
0
Почетный модератор
21400 / 9134 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
15.04.2014, 18:00 4
Цитата Сообщение от rempaul Посмотреть сообщение
как дождаться момента, когда Timer1 остановится
Таймер "тикает" в отдельном потоке вроде как, поэтому на переменных при такой задаче далеко не уедешь.
Могу посоветовать использовать многопоточность, но лучше подождать, когда ответят что-то более толковое
0
1 / 1 / 0
Регистрация: 28.02.2014
Сообщений: 43
15.04.2014, 18:42  [ТС] 5
Я поставил таймер что бы периодически делать опрос директории на компьютере на наличие нужного файла, если файл есть, то остановить таймер и продолжить основную программу. Может есть способы по другому это реализовать?
0
Почетный модератор
21400 / 9134 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
15.04.2014, 18:57 6
Тут все не так однозначно, как кажется.

Вот Вы мониторите папку на появление файла. Имя этого файла известно? Что о нем вообще известно?
Сколько времени занимает поиск?

Второй вопрос - что происходит в коде до того, как таймер начинает искать файл, что после и что в случае, если файл будет найден?
0
1 / 1 / 0
Регистрация: 28.02.2014
Сообщений: 43
15.04.2014, 19:45  [ТС] 7
Имя известно, ищу так
VB.NET
1
2
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
 If IO.File.Exists("C:\Users\Aleksanr\Documents\Ansoft\graf.csv") Then
Далее если файл найден - проверяю есть ли в нем нужное мне значение, если есть - останавливаю таймер, останавливаю процедуру, меняя значение переменной boolean, если нет перехожу к следующему шагу в главной процедуре. Если файла нет, таймер ждет пару секунд, затем снова проверяет и так до тех пор, пока не найдет
Перед поиском файла запускается внешнее приложением, результатом работы которого и будет появление файла. В общем как-то так
0
Почетный модератор
21400 / 9134 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
15.04.2014, 19:50 8
Поиск в таком случае не нужен.
Достаточно проверять наличие файла
VB.NET
1
2
If IO.File.Exist("C:\Folder\SubFolder\MyFile.txt") Then
'Файл есть, парсим.
Такой поиск файла как и его парсинг - доли секунды, не вижу смысла останавливать все приложение.


Так поместите в таймер весь код вместе с проверкой файла, его парсингом и выполнением с полученными данными нужных действий. Не думаю, что стоит это распределять по разным методам
0
1 / 1 / 0
Регистрация: 28.02.2014
Сообщений: 43
15.04.2014, 20:06  [ТС] 9
Наверно я не так выразился, сформулирую конкретней суть вопроса. Допустим есть такой код:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
' запускаем программу, результатом работы которой будет появление файла
Dim myProcess As Process = System.Diagnostics.Process.Start("C:\Program Files\AnsysEM\HFSS15.0\Win64\hfss.exe")
 
 
' далее нужно уловить момент когда этот файл появится и выполнить код ниже
 If IO.File.Exists("C:\Users\Aleksanr\Documents\Ansoft\graf.csv") Then
 
            Dim start As Integer
            Dim Massiv() As String = IO.File.ReadAllLines("C:\Users\Aleksanr\Documents\Ansoft\graf.csv", System.Text.Encoding.Default)
            For start = 1 To Massiv.Length - 1
                Dim zn As String = Massiv(start)
                If zn.IndexOf("1,") = 0 Then
                    Dim trt As Double = Replace(Mid(zn, 4, 2), ".", ",")
 
                    If trt >= 25.0 Then
                        Timer1.Stop()
                        MsgBox("условие выполняется")
                        ct = True
                        Exit Sub
                    End If
                End If
            Next
            Timer1.Stop()
            MsgBox("условие не выполняется")
            ' Удаляем процесс и проекты
            kill_hfss()
       
        End If
я делал это поместив поиск файла в событие таймера, но программа запускает таймер и передает управление дальше, не дожидаясь остановки таймера

В целом вот так: я запускаю внешнюю программу, жду когда она выдаст файл(это может затянуться до нескольких минут), проверяю устраивает ли меня этот файл, если устраивает останавливаю все процедуры, если не устраивает - повторяю цикл, т.е снова запускаю внешнюю программу и проверяю файл на выходе
0
Почетный модератор
21400 / 9134 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
15.04.2014, 20:20 10
Цитата Сообщение от rempaul Посмотреть сообщение
передает управление дальше
Вот я и спрашивал, что там - дальше, после таймера

В общем, я понял так:
Идет выполнение какого-то кода до этого участка.
Потом тут таймер начинает проверять файл и парсить.
Если файла нет, то таймер должен так и крутиться, не давая программе выполняться дальше.
Только нашел и распарсил - пошло дальше.

Если так, то вот Вам демо. В кнопке что-то выполняется, потом надо ждать файл.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox("Hello, ""BreakFast!""")
        Do While Work() = False
            Application.DoEvents()
            Me.Text = "Все еще нет..."
        Loop
        Me.Text = "Ура, дождались!"
        MsgBox("Bye :(")
    End Sub
 
    Function Work() As Boolean
        If IO.File.Exists("C:\10.txt") Then
            Return True
        End If
        System.Threading.Thread.Sleep(1000)
    End Function
Учтите, что при этом программа будет "висеть".
Если интерфейс приложения будет нужен во время ожидания файла, весь код кнопки надо будет поместить в метод и выполнить его в отдельном потоке.
0
55 / 55 / 5
Регистрация: 17.09.2012
Сообщений: 128
16.04.2014, 11:30 11
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

для отслеживания момента появления нужного файла в заданной папке можно воспользоваться классом FileSystemWatcher
0
16.04.2014, 11:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2014, 11:30
Помогаю со студенческими работами здесь

Как прервать выполнение процедуры или функции
Имеется примерно такой код: On Error GoTo MainErr MkDir "С:\A" MainErr: MsgBox...

Прервать одну процедуру из другой процедуры
Есть кнопка Button2, клик по которой вызывает процедуру, и есть вторая процедура косвенно...

Как повторить выполнение кода из одной процедуры в другую?
У меня по нажатию кнопки выполняется определенный код как сделать чтобы по нажатию клавиши Enter в...

Как задать зависимость одной процедуры от другой?
Подскажите как задать зависимость одной процедуры от другой.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru