quickbox icon indicating copy to clipboard operation
quickbox copied to clipboard

tisk s termotiskárnou bez papíru -> freeze QE

Open otahirs opened this issue 6 years ago • 7 comments

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.

otahirs avatar Jan 25 '20 11:01 otahirs

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;
}

otahirs avatar Jan 25 '20 14:01 otahirs

pokud se rozjede po vlozeni papiru, tak si myslim, ze to snad ani neni potreba opravovat, leda pridat hlasku "Dosel papir"

fvacek avatar Jan 25 '20 16:01 fvacek

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.

otahirs avatar Jan 25 '20 16:01 otahirs

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.

fvacek avatar Jan 25 '20 17:01 fvacek

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..

otahirs avatar Jan 25 '20 17:01 otahirs

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.

arnost00 avatar Dec 28 '20 08:12 arnost00

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.

fvacek avatar Dec 28 '20 11:12 fvacek