libksane seems to break QProcess::start calls

Tobias Leupold tl at l3u.de
Thu Mar 3 12:54:32 GMT 2022


Hi all :-)

I have a very odd problem, and I have no idea what could cause this or even 
how to debug this. maybe, someone of you can give me a hint.

I revently wrote a small helper program for one special purpose: Scanning 
documents at a defined size, post processing them a bit and saving the 
processed, compressed images as a PDF file to e.g. send them via mail. The 
sources can be found at https://invent.kde.org/tleupold/scandoc/ .

It uses libksane, ImageMagick's convert and pdfjam as helper programs. This 
may be too special or too hacky to become e.g. an official KDE extragear 
program, but that's another thing.

However the problem is:

As said, the program uses convert to post process the scanned images. I use 
QProcess to run the respective command, in a procedural, synchronous way, as 
the command is typically finished within fractions of a second. The call 
strips down to:

    QProcess process;
    process.start(command, arguments);
    waitForFinished();

Using one scanner I have (it's a Brother MFC device), this works without a 
problem. Everything is fine. But using another one, a CanoScan LiDE 25, a 
really strange problem happens:

After having scanned the first page, everything works as expected. But after 
having scanned the second one, the QProcess call doesn't exit anymore. It runs 
normally, and the output file is created. But it doesn't return, until it's 
killed by the waitForFinished() call. ps lists the process as "defunct".

As expected, the GUI freezes for 30 seconds (the default timeout). But after 
the process is killed, the GUI is still frozen for another 30 seconds (why?!), 
then it becomes responsive again and the post processed image is added like if 
the call would have exited normally.

It's also not about the "convert" call. Each and every QProcess I start after 
the seconds scan does not exit anymore. Even something like "dmesg" or such. 
After the first scan, everything is fine, after the second scan, 
QProcess::start does not exit anymore. As long as I don't do a second scan, I 
can start as many QProcess processes as I want, and all exit normally. But not 
anymore after the second page.

I also tried to create the QProcess on the heap, and to implement the command 
run asynchronously. The result is the same: After the first scan, the process 
returns normally, after the second scan, it doesn't exit anymore ("can't 
start, already running").

To make it even more peculiar: At first, I implemented the convert process to 
read from stdin and write to stdout, piped the image data to it, and read the 
output to get the processed image directly. This caused no problem, no matter 
how much scans I did. But later on, I needed to call programs not reading from 
stdin.

So ... how can that even happen? Where do the 30 seconds unresponsiveness come 
from, after the QProcess has already been killed?! Is this something that 
libksane causes? How can it influence a completely unrealted QProcess call? Or 
did I simply write crappy code?!

If anybody has any idea about this, I would really appreciate some 
enlightenment ;-)

Thanks for all help in advance!
Cheers, Tobias




More information about the kde-devel mailing list