<font color="green">//EDIT
Odwołuję poniższe pytanie, bo odpowiedź była prostsza i to ja schrzaniłem jakąś banalną sprawę. Heh, zwykle tak jest.
Tym niemniej post zostawiam, by uprzedzic o potencjalnie mozliwych problemach z QueryPerformanceCounter w wieloprocesorowych maszynach.</span>

Mam program w którym oddzielny wątek ('portowy') nieustannie i z priorytetem RealTime przeglada stan portu LPT i zgłasza zmiany do głównego wątku procesu. (Wątek jest zrobiony na klasie pochodnej od TThread).
Komunikacja jest dwukierunkowa, bo główny może w każdej chwili zapytać o stan portu, wyłączyc śledzenie, zmienić śledzone bity itp. Komunikacja zachodzi przez podwójny (oddzielnie z-głównego-do-portowego i z-portowego-do-głównego) bufor FIFO. Każdy komunikat w buforze ma pole TimeStamp. Dla komunikatów idących z portowego pole to jest wypełniane przez portowy wartością QueryPerformanceCounter. Główny w pewnych ważnych momentach też wywołuje QueryPerformanceCounter i dzieki temu może wyliczyć czas pomiędzy ważnym momentem a (wykrytą i zgłoszoną przez portowy) zmianą na porcie.
I to zaczęło mi dawać jakies bzdury. Zacząłem się zastanawiać, czy powodem nie jest to, że procesor jest HT czyli dla systemu są dwa procesory.

I w MSDN zanalazłem: <font color="indigo">On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL). To specify processor affinity for a thread, use the SetThreadAffinityMask function. </span>

Czyli jest prawdopodobne że błąd wynika z tego, ze główny i portowy działają na "innych procesorach".

<font color="red">Pytanie: i co ja mam teraz zrobić????</span> [glowa] [glowa]

Muszę wywołać QueryPerformanceCounter zawsze w tym samym wątku chyba.
[ale nie chcę zmuszać żeby portowy i główny chodziły na tym samym procesorze przez SetThreadAffinityMask]

Mógłbym wywoływać QueryPerformanceCounter dla portowego przez Sychronize (czyli w kontekście głównego), ale portowy jest zrobiony po to, żeby było szybko, a nie by czekał aż główny się uruchomi.

Mógłbym wywoływać QueryPerformanceCounter dla głównego w kontekście portowego, ale nie wiem jak.

Mógłbym stworzyć w moim buforze FIFO komunikat, którym główny pytałby portowy o stan timera, a portowy by odpowiadał też komunikatem.
Problem w tym, że w momencie zapytania w buforze portowy-do-głównego mogą już być jakieś komunikaty, zaś główny często sprawdza czas poza normalną petlą odbierania komunikatów. Czyli musiałby albo zaczekac z dowiedzeniem się jaki był czas aż dojdzie do tej petli (niedobrze) albo zrobić dodatkową pętlę i czekać w niej na odpowiedź portowego o czas. Tylko że wtedy musiałby wyrzucić te komunikaty co były wcześniej w buforze, bo odebranie komunikatu kasuje go w buforze. I mógłby zgubic ważną informację.

Na razie pomysł na jaki wpadłem to robienie QueryPerformanceCounter tylko w portowym, zaś główny pytałby komunikatem, ale przez INNY bufor (zrobiony tylko po to), żeby uniknąć kolejek w normalnym buforze lub wyrzucania komunikatów.

Jesli komukolwiek chciało się czytac ten post, i ma jakikolwiek pomysł, bede BARDZO wdzięczny za pomoc.

//EDIT zaraz zaraz, jeszcze mi jedna przyszła rzecz do głowy. Czy konkretny wątek, zaczynając od Resume a skończywszy na Suspend, jest wykonywany ciagle na jednym procesorze? Czy też system przerzuca go z procesora na procesor? Bo jeśli to drugie, to i tak muszę zrobić SetAffinityThreadMask - przynajmniej dla tego wątku, który będzie sprawdzał licznik...