Mam dość nietypowy problem z tą biblioteką, który objawia się tym, że nic się nie drukuje.
To czym różni się mój kod od przykładu:
w przykładzie wszystko w głównym wątku i main()
u mnie w moim demo przy uruchomieniu aplikacji rozpocznam połączenie, przy wyłączeniu zamykam połączenie, na żądanie drukuje paragony .itp, każda z operacji w oddzielnym Task.Run() aby nie blokować głównego wątku.
Proste spradzenie stanu zwraca -1 w task.run ale już jak wszystko mam w main() jak w dokumnetacji to działa.
Analogicznie zachowuje się drukowanie paragonów. Oczywiście programy testuję w róznym czasie i nie uruchamiam 2 na raz.
Czy ktoś pracował z bilblioteką NFPDrv.dll? Czy ktoś wie co dzieje się pod spodem w tej dll od Novitus?
Chce uniknąć blokowania głównego wątku. W róznych programach od Novitusa widać jak blokuje się okno gdy się program nie może podłączyć do drukarki fiskalnej i dla mnie to jest zbyt uciążliwe, żeby sobie na to pozwolić.
Ostatecznie zostaje mi przygotowanie oddzielengo procesu.
Poniżej minimum kodu w którym już widać problem. Wyciąłem pokazywanie komunikatów dla użytkownika.
class ApiWrapper
{
//...........
public int checkDLE(ref DLEStatus dle)
{
IntPtr intPtr = Marshal.AllocHGlobal(Marshal.SizeOf((object)dle));
Marshal.StructureToPtr((object)dle, intPtr, fDeleteOld: false);
Api.ndrv_ioctrl(2, (IntPtr)0, 0, 0);
if (Api.ndrv_ioctrl(3, intPtr, 1, 0) == 0)
{
dle = (DLEStatus)Marshal.PtrToStructure(intPtr, typeof(DLEStatus));
return 0;
}
return -1;
}
}
main()
{
var wrapper = new ApiWrapper();
wrapper.init();
var portParams = new TCPIPPortParameters();
portParams.host = 192.168.0.2;
portParams.port = 1234;
portParams.mTimeout = 10000;
var openResult = wrapper.openTCPIPEx(portParams);
var status = new DLEStatus();
var checkResult = wrapper.checkDLE(ref status);
Assert.AreEqual(checkResult, 0); //w main dziala
}
//usluga
main()
{
//gdzies na starcie
Task.Run(() => {
var wrapper = new ApiWrapper();
wrapper.init();
var portParams = new TCPIPPortParameters();
portParams.host = 192.168.0.2;
portParams.port = 1234;
portParams.mTimeout = 10000;
var result = wrapper.openTCPIPEx(portParams);
});
ProcessRequest();
Task.Run(() => {
var wrapper = new ApiWrapper();
wrapper.close();
});
}
void ProcessRequest(...) {
Task.Run(() => {
var wrapper = new ApiWrapper();
var status = new DLEStatus();
var result = wrapper.checkDLE(ref status);
Assert.AreEqual(result, 0); //tutaj juz nie dziala
});
}