MasterGamerFX Ответов: 1

Делайте это до тех пор, пока процесс не загрузится


Hii я хочу сделать цикл который проверяет существует ли этот процесс

Мой код таков:

Dim RunProc As Process() = Process.GetProcessesByName("photoshop")

Do Until RunProc.Length > 0
            Label1.Text = "game running"
            Delay(5)

            Exit Do
        Loop

Я хочу сделать цикл, который запускает sleep(5000) до тех пор, пока RunProc = photoshop process
ТНК

Что я уже пробовал:

Я попытался сделать какую-то петлю с помощью "until loop"

Dave Kreskowiak

И в чем твоя проблема с этим маленьким заданием?

OriginalGriff

Это не очень хороший вопрос - мы не можем понять из этого малого, что вы пытаетесь сделать.
Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы.
Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

1 Ответов

Рейтинг:
0

Richard Deeming

Process.GetProcessesByName возвращает моментальный снимок запущенных процессов в момент их вызова. Вы вызываете его только один раз, вне вашего цикла. Таким образом, если процесс не выполняется, когда начинается цикл, цикл никогда не закончится.

Попробуйте вместо этого что-нибудь вроде этого:

Do Until Process.GetProcessesByName("photoshop").Length > 0
    System.Threading.Thread.Sleep(5000)
Loop
NB: Если вы делаете это в потоке пользовательского интерфейса, ваше приложение будет заморожено до начала процесса. Вы должны рассмотреть возможность использования Async и Await вместо:
Асинхронное программирование с использованием Async и Await (Visual Basic) | Microsoft Docs[^]

Например:
Public Shared Async Function WaitForProcessAsync(ByVal name As String, ByVal cancellationToken As CancellationToken) As Task(Of Process)
    Do Until cancellationToken.IsCancellationRequested
        Dim p As Process() = Process.GetProcessesByName(name)
        If p.Length > 0 Then Return p(0)
        Await Task.Delay(5000, cancellationToken)
    Loop
    
    Return Nothing
End Function


MasterGamerFX

ладно ,я пытаюсь, но думаю о другом варианте

но я подумал, как это сделать, если этот процесс не запустился за 2 секунды, а затем сделать что-то вроде msgbox ..

Richard Deeming

Используйте Async версия, которую я опубликовал:

Dim cts As New CancellationTokenSource(TimeSpan.FromSeconds(2))
Dim p As Process = Await WaitForProcessAsync("photoshop", cts.Token)
If p Is Nothing Then MessageBox.Show("...")

Вы, очевидно, захотите уменьшить задержку внутри метода с текущих пяти секунд - например:
Await Task.Delay(500, cancellationToken)

MasterGamerFX

хорошо, но где я помещаю код ?

Richard Deeming

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

Вы помещаете код для вызова этой функции туда, где вы хотите дождаться процесса.

MasterGamerFX

я стараюсь, но у меня есть ошибки
нужна помощь объясните мне лучше пожалуйста

Richard Deeming

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

MasterGamerFX

хорошо , я загружаю картинку, которая объясняет, что у меня есть (ошибки)

https://imgur.com/aKZomID

Richard Deeming

Серьезно?

Public Shared Async Function WaitForProcessAsync(ByVal name As String, ByVal cancellationToken As CancellationToken) As Task(Of Process)
    Do Until cancellationToken.IsCancellationRequested
        Dim p As Process() = Process.GetProcessesByName(name)
        If p.Length > 0 Then Return p(0)
        Await Task.Delay(5000, cancellationToken)
    Loop
    
    Return Nothing
End Function

Private Async Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim cts As New CancellationTokenSource(TimeSpan.FromSeconds(2))
    Dim p As Process = Await WaitForProcessAsync("photoshop", cts.Token)
    If p Is Nothing Then MessageBox.Show("...")
End Sub
Добавь Imports System.Threading в верхней части файла и измените "..." в MessageBox.Show к сообщению, которое вы хотите отобразить.

MasterGamerFX

Кто-нибудь может помочь мне закодировать его, пожалуйста