Hi Allz,
Semaphore: Klar, das sind Objekte die eindeutig in die Welt des Multitasking gehören, in VB kommt man dank der fehlenden (oder fehlerhaften) Multithreading-Fähigkeiten von VB, kaum in den Genuß (oder Pflicht) Semaphoren einsetzen zu können.
Es gibt aber dennoch spezielle Fälle, in denen der Einsatz von Semaphoren auch in VB einen Sinn geben könnte.
Es gibt folgendes "teufliches" Szenario:
Ein User startet Euer Programm und weiß, dass das Programm gewisse Zustände wärend der Runtime in eine INI-Datei sichert. Sehr schön. Der "gewifte" User legt Euer Proggi in die Taskleiste und ändert während der Runtime den Wert in der Ini, um beispielsweise einen Punktestand zu manipulieren.
Der User hat aber vielleicht nicht die Kenntnis darüber, dass das Programm über wichtige Teile der Ini eine Prüfsumme gebildet hat und die Prüfsumme mit dem Inhalt der Ini vergleicht.
Natürlich kann man promt auf die Manipulation reagieren - aber auch: Man läßt den User zunächst im Glauben, das funzt . In Wahrheit befindet sich der User in einem Teufelskreislauf, unmerklich aber stetig wird das Programm immer langsamer, es scheint so, als friert Windows langsam aber sicher zu einem Eisblock, bis der User die Lust an dieser Sitzung verliert und ihm eine heilsame Lehre erteilt wurde: Lasse die Finger von der Ini weg!
Realisiert wird das mit einer Semaphore. Es ginge auch durchaus mit VB-Bordmitteln,
aber nicht so elegant.
'Die WinAPI-Funktionen:
PRIVATE DECLARE FUNCTION CloseHandle LIB "kernel32" (BYVAL hObject AS LONG) AS _
LONG
PRIVATE DECLARE FUNCTION WaitForSingleObject LIB "kernel32" _
(BYVAL hHandle AS LONG, BYVAL dwMilliseconds AS LONG) AS LONG
PRIVATE DECLARE FUNCTION CreateSemaphore LIB "KERNEL32.DLL" ALIAS _
"CreateSemaphoreA" (lpSemaphoreAttributes AS SECURITY_ATTRIBUTES, _
BYVAL lInitialCount AS LONG, BYVAL lMaximumCount AS LONG, _
lpName AS LONG) AS LONG
PRIVATE TYPE SECURITY_ATTRIBUTES
nLength AS LONG
lpSecurityDescriptor AS LONG
bInheritHandle AS LONG
END TYPE
PRIVATE CONST WAIT_TIMEOUT = 258&
PRIVATE hSemaphore AS LONG Jene "teufliche" Funktion:
Function CheckIni() AS Long
Static b As Boolean
Static n As Long
Dim hResult As Long
Dim sec As SECURITY_ATTRIBUTES
' Funktionen, die die Ini-Prüfen
If CRCSum <> Checksumme And Not b Then
b = True
n = 10
hSemaphore = CreateSemaphore(sec, 1, 1, Byval 0&)
End If
hResult = WaitForSingleObject(hSemaphore, n)
If hResult = WAIT_TIMEOUT Then n = n + 100
End If Wenn die Funktion also eine Manipulation an der Ini feststellt, so setzt es einmalig die Semaphore in hSemaphore. WaitforSingleObject wird durchlaufen. Aber dann geht es los: Jedes Mal wenn die Prüfsumme der Ini abgefragt wird, wird das System langsamer, dies wird durch WaitforsingleObject realisiert. Ist der Wert von n = INFINITE,
so kann der User nur noch den Stöpsel ziehen, weil nichts mehr geht, sprich: Dieser Task ist vom Taskscheduler von Windows ausgenommen. 0 |