VB .net не мог спать () в течение очень очень коротких промежутков времени - PullRequest
0 голосов
/ 20 сентября 2011

Я хотел бы sleep для packetSize / Bandwidth длительность для сетевого приложения в VB.

Это значение варьируется от "10 ^ -3 - 10 ^ -6" секунд.

Когда я использую функцию Sleep (), я думаю, что она не спит в течение продолжительного времени, если онаменьше единицы (<1 сек ~ ~ 0 сек ??). </p>

Отредактировано:

  1. Я должен продолжать посылать пакеты после короткого сна выше указанного диапазона.Таким образом, я не могу указать, например, чтобы спать на 0,001 миллисекунды на стороне клиента.
  2. Мое требование - на стороне клиента приложения CS, которое читает файл и продолжает отправлять небольшие пакеты на регулярной илинерегулярный интервал снов на Сервер.Сервер позже захватывает пакеты и обрабатывает их с собственной скоростью.

Как этого добиться?

Ответы [ 4 ]

1 голос
/ 20 сентября 2011

Разрешение Sleep до миллисекунды - это 10 ^ -3. (См. http://msdn.microsoft.com/en-us/library/d00bd51t.aspx и http://msdn.microsoft.com/en-us/library/274eh01d.aspx). Одна секунда - 1000 миллисекунд; это сон (1000).

Вы не можете использовать Sleep () для значений менее 10 ^ -3 секунд. Я успешно использовал Sleep () со значениями 62, 125 и 250 миллисекунд.


Вы можете поэкспериментировать с System.Diagnostics.Stopwatch; возможно, из этого можно построить функцию ожидания или паузы. (См. http://msdn.microsoft.com/en-us/library/ebf7z0sw.aspx)

0 голосов
/ 21 сентября 2011

Я только изучаю концепцию StopWatch в VB ... Будет ли работать следующий блок кода?

Private Sub MyWaiter(ByVal delay As Double)

    Dim sw As Stopwatch = New Stopwatch()

    sw.Start()

    Do While sw.ElapsedTicks < delay * TimeSpan.TicksPerSecond
        ' Allows UI to remain responsive
        Application.DoEvents()
    Loop

    sw.Stop()

End Sub
0 голосов
/ 21 сентября 2011

Я подозреваю, что вы переосмыслили проблему. Сетевые коммуникации имеют буфер, потому что они не могут реально ожидать, что приложение будет готово и ожидает каждого переданного бита. Я бы посоветовал прочитать столько данных, сколько доступно, поспать и повторить.

Do Until all data is read
    While buffer contains data
        read data
    Wend
    ' Let other threads have a go, but come back as soon as possible.
    Thread.Sleep(0)
Loop

Подходит ли это вашей цели?

0 голосов
/ 20 сентября 2011

Нет никаких функций ожидания системы с тайм-аутом с микросекундным разрешением.Вам понадобится занятая петля и таймер высокого разрешения.Конечно, система в любом случае может вытеснить ваш поток, так что вы можете забыть о гарантиях реального времени в Windows.

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