Сообщения VB.net перекачаны на ярлык - PullRequest
0 голосов
/ 09 мая 2011

Я в основном хочу внедрить Label и постоянно показывать информацию пользователю. Я хочу иметь возможность сделать что-то вроде этого:

someMethod():
    printMessage("Starting program")
    doWork() //possibly does some calls to printMessage()
    printMessage("Finished program")
end

printMessage(string message)
    mylabel.Text += message
end

И ярлык на форме Windows постоянно показывает этот вывод. То есть вместо того, чтобы пользователю приходилось ждать, пока не завершится someMethod (), и когда вся информация внезапно была выгружена на этикетку, я хочу, чтобы она выводилась на этикетку по мере выхода информации.

Я попытался посмотреть на многопоточность, чтобы решить эту проблему, и у меня она работает, используя код, подобный следующему:

someMethod():
    Dim t As New Thread(AddressOf printMessage)
    t.Start("Starting program")
    doWork()
    printMessage("Finished program")
end

(И есть делегат для printMessage, и внутри я проверяю свойство InvokedRequired mylabel) Но при этом я продолжаю получать всю информацию, просто внезапно сбрасываемую на метку, и порядок больше не сохраняется. Я могу получить вывод как:

"some other data from doWork()"
"Finished program"
"Starting program"

Так есть идеи, как мне это сделать?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 09 мая 2011

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

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

А остальная часть приложения будет реагировать на изменения.

BackGroundWorker имеет событие DoWork, в которое можно поместить код, который выглядел (примерно) так:

BGW.ReportProgress(0, "Starting Task1")
DoTask1()
BGW.ReportProgress(0, "Completed Task1")

BGW.ReportProgress(0, "Starting Task2")
DoTask2()
BGW.ReportProgress(0, "Completed Task2")

Вы также обработали бы событие ProgressChanged, которое будет запущено (в потоке).который начал рабочий), чтобы обновить метку.

0 голосов
/ 09 мая 2011

Вызов на Application.DoEvents() может быть полезным, так как заставляет окно обновляться.

Попробуйте разместить его сразу после каждого из printMessage вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...