Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек 013.doc
Скачиваний:
21
Добавлен:
07.02.2015
Размер:
137.73 Кб
Скачать

Public Sub StartLongTask(ByVal Iterations As Long)

' This is a short circuit for testing call overhead. See CallAnotherCoffee.

If Iterations = 0 Then Exit Sub

' Store the size of the dummy task.

mlngIterations = Iterations

' Give the timer a short interval, and set it running just before returning.

mwXTimer.Interval = 55

mwXTimer.Enabled = True

End Sub

' GetCoffeeOnSameThread creates a new Coffee object on the same thread, simulating the effects of thread pooling. This can only be done internally, as explained in "How Object Creation Works in Visual Basic" in Books Online.

'

Public Function GetCoffeeOnSameThread() As Coffee

' All objects created using New will be on the creator's thread, even a new Coffee object.

Set GetCoffeeOnSameThread = New Coffee

End Function

' GetCoffeeOnNewThread creates a new Coffee object on a new thread, by calling CreateObject to create the new Coffee object. The difference between this and the internal creation done by GetCoffeeOnSameThread is explained in "How Object Creation Works in Visual Basic" in Books Online.

'

' Note that this technique could be used to create objects on different threads that could communicate with each other, without the client having to pass one object a reference to the other (as CoffeeWatch does). If you experiment with this, remember that the overhead of marshaling calls between threads is almost as great as the overhead of marshaling calls across processes.

'

Public Function GetCoffeeOnNewThread() As Coffee

' Create as if by external client.

Set GetCoffeeOnNewThread = CreateObject("MTCoffee.Coffee")

End Function

' CallAnotherCoffee gives a rough measure of cross-thread call overhead. Pass it a Coffee object on another thread, or on the same thread, and compare the results; the method makes dummy calls to StartLongTask, so that it's essentially measuring only the call overhead.

'

Public Function CallAnotherCoffee(ByVal cfe As Coffee) As Double

Const TRIES = 10000

Dim timeStart As Long

Dim timeEnd As Long

Dim lngTries As Long

timeStart = timeGetTime

For lngTries = 1 To TRIES

cfe.StartLongTask 0

Next

timeEnd = timeGetTime

'

' Return seconds (ss.mmm) per call. (This will give an incorrect result if you happen to run CallAnotherCoffee just as the system timer is rolling over to zero.)

CallAnotherCoffee = ((CDbl(timeEnd) - timeStart) / 1000#) / TRIES

End Function

Private Sub Class_Initialize()

' Increment the global count (that is, for this thread) of Coffee objects.

glngGlobalData = glngGlobalData + 1

'

' Create a timer object.

Set mwXTimer = New XTimer

End Sub

Private Sub Class_Terminate()

' Decrement the global count (that is, for this thread) of Coffee objects.

glngGlobalData = glngGlobalData - 1

'

' Free the timer object.

Set mwXTimer = Nothing

End Sub

Private Sub mwXTimer_Tick()

' First thing, turn off the timer.

mwXTimer.Enabled = False

Call LongTask

End Sub

' The dummy task.

Private Sub LongTask()

Dim dblDummy As Double

Dim lngCt As Long

Dim sngNextMark As Single

Dim blnCancel As Boolean

' For small transactions, don't bother to call back while running.

If mlngIterations < 100000 Then

sngNextMark = 1!

Else

sngNextMark = 0.1!

End If

' This is just a time-waster.

For lngCt = 1 To mlngIterations

' If this were a real application, a unit of work would be done here. You may find it interesting to replace this processor-intensive activity with one that waits on the system a lot, such as calls to a database on another machine, or reading a very large file. Throughput on a single-processor workstation is far greater when most threads are blocked, waiting for file input or the result of a database call.

dblDummy = 3033.14159 * 2081.14159 * 1138.14159

If CDbl(lngCt) / mlngIterations > sngNextMark Then

RaiseEvent Progress(sngNextMark, blnCancel)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]