tisk s termotiskárnou bez papíru -> freeze QE
Dojde-li v termotiskárně papír a má se vytisknout lísteček (ať už manuálně nebo autoprint), tak zamrzne QE na počítači, ke kterému je tiskárna připojena.
předpokládám, že následující sekci z receiptsprinter.cpp bude nutno přepsat pomocí https://doc.qt.io/qt-5/qserialport.html a odchytat nějaké errory.
case ReceiptsPrinterOptions::CharacterPrinteType::LPT: {
if (!printer_opts.characterPrinterDevice().isEmpty()) {
save_file(printer_opts.characterPrinterDevice());
}
break;
}
pokud se rozjede po vlozeni papiru, tak si myslim, ze to snad ani neni potreba opravovat, leda pridat hlasku "Dosel papir"
Pokud by to šlo lehce opravit (zmíněnou hláškou), bylo by to supr. 10 minutové hledání u vyčítání proč mi freezuje QE není nic příjemného.
Co jsem zběžně koukal tak podpora QT pro LPT není na takové úrovni jako pro COM/try, takže se trochu ztrácím.
V soucasnosti QE tiskne na termotiskarnu bud:
- v textovem modu, tam se to urcite jetnoduse nedozvime, protoze se jen posilaji data do
/dev/usb/lpt1. Nerikam, ze to nejde, jenom ze to nejde jednoduse a ted ani nevim jak - v grafickem modu ma tiskarna driver, takze konec papiru by mel jit asi zjistit mnohem snaze.
QSerialPort nepodporuje takovéto zařízení, takže by se to muselo řešit asi pomocí sytémových api. Žádnou jednoducho cestu k implementaci nevidím..
Me napada zatim jenom oddelit samotny tisk (save_file) do worker threadu, a v hlavnim pak informovat ze se hromadi listecky v tiskove fronte. Takhle by nezamrzlo cele QE ale jenom jeden thread.
Ja se multithreadingu v tomto pripade docela bojim.
V grafickem tisku budme muset asi stejne kreslit na canvas tiskarny v UI == main threadu, to se pokud jsem neco neprehledl, nezmenilo, takze bychom museli vyrobit nejaky metafile a ten poslat do print-threadu. Nikdy jsem to nedelal, ale asi by to nakonec slo. Jen se bojim, ze ta cena je prilis vysoka vzhledem k relativne malo zavazne chybe, kterou to resi. To, ze v tiskarne neni papir zjisti obsluha hned, jak nekomu nevyjede ustrizek.
Mozna by se dalo vyuzit QPrinter::PrinterState QPrinterInfo::state() const, mohlo by to bez papiru reportovat nejakej error a pak by se program dokazal zachovat korektne i v single-threadu.
V textovem tisku se tiskne tak, ze se zapisuje do souboru. Koukal jsem do zdrojaku a chybi tam kontrola, kolik bytes se podarilo zapsat, takze if na radku receiptsprinter:123 by asi taky dokazal ledacos zachranit.