Probleme mit IowKitCancelIo

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
hannes
Posts: 4
Joined: Thu Aug 25, 2005 1:46 pm

Probleme mit IowKitCancelIo

Post by hannes »

hi,
ich habe ein kleines Problem mit der Funktion CancelIo.
In meinem Programm habe ich eine Task der ueber die Funktion Read die Pins 123 des Ports0 vom IOW24 einliest. Da ich keine Timeout habe blockiert der Task bis sich was am Eingang aendert. Der MainTask macht was anderes, und ruft am ende CancelIO(handle, 0), damit der andere Task weitermacht. CancelIo gibt true zurueck, aber der andere Task haeng immer noch. Das Programm habe ich mit c++.net geschrieben, das verhalten ist unter C# das gleiche. Was mache ich falsch?

Sdk & LIB Version 1.4
Der Code ist nicht schoen

Code: Select all

#include "stdafx.h"
#include "time.h"
#include "iowkit.h"
#using <mscorlib.dll>
using namespace System;
using namespace System::Threading;

public __gc class ThreadExample 
{
public:

	static IOWKIT_HANDLE iow;
	static void ThreadProc()
	{
		for (int i = 0; i < 15; i++) 
		{
			Console::Write("ThreadReadIOWPins: ");
			Console::WriteLine(i);
			IOWKIT24_IO_REPORT rep;
			rep.ReportID = 0x0;
			rep.Value = 0x00;
			IowKitRead(iow, IOW_PIPE_IO_PINS, (PCHAR) &rep, IOWKIT24_IO_REPORT_SIZE);
			Console::Write("ThreadReadIOWPins: Readsomething Port0:");
			Console::WriteLine(rep.Bytes[0] & 0x0e);
		}
	}

	static void init(){
		WCHAR sn[9];
		IOWKIT24_IO_REPORT rep;
		iow = IowKitOpenDevice();
		IowKitGetSerialNumber(iow, sn);
		printf("S/N \"%ws\"\n", sn);
		//using only Port0 pins 123 for input
		rep.Value=0x000e;
		IowKitWrite(iow, IOW_PIPE_IO_PINS, (PCHAR) &rep, IOWKIT24_IO_REPORT_SIZE);

	}

	static int startThread()
	{
		BOOLEAN ret =false;
		init();
		Console::WriteLine(S"Main thread: Start a second thread.");
		Thread *oThread = new Thread(new ThreadStart(0, ThreadProc));
		oThread->Start();
                // do was zzzzzzZZZZZzzzzz
		Thread::Sleep(10000);
		ret =IowKitCancelIo(iow, IOW_PIPE_IO_PINS);
		Console::Write(S"Main thread: CancelIo: ");
		Console::WriteLine(ret);
		Thread::Sleep(1000);
		Console::ReadLine();
		return 0;
	}
};

int main(int argc, char* argv[])
{
	ThreadExample::startThread();

	return 0;
}

Ausgabe: 

Main thread: Start a second thread.
ThreadReadIOWPins: 0
ThreadReadIOWPins: Readsomething Port0:0
ThreadReadIOWPins: 1
ThreadReadIOWPins: Readsomething Port0:14
ThreadReadIOWPins: 2
Main thread: CancelIo: 1

Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

IowKitCancelIO ist nicht wirklich durchgetestet und nur noch aus Kompatibilitaetsgruenden im API.
Das zugrundeliegende CancelIo funktioniert nur innerhalb eines Threads und daher ist meine Beschreibung in der Dokumentation schlicht falsch.
Mit CancelIo kann also nur ein asynchrones Read abgebrochen werden.

Die Funktion IowKitCancelIo wird daher mit sofortiger Wirkung als inoperabel und daher unbenutzbar deklariert.

In diesem Fall kann einfach IowKitReadImmmediate benutzt werden. Alternativ einen Timeout setzen.
hannes
Posts: 4
Joined: Thu Aug 25, 2005 1:46 pm

Post by hannes »

Danke fuer die schnelle Antwort, dann werde ich es mal mit dem Timeout versuchen.
hannes
Post Reply