Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QtWebkit multithreading



  • I am working on a project to render text as images using QT-Jambi.

    The webkit renders the HTML and generates the image.
    While running the code with a single thread there are no issue
    but when I run the program using multiple threads(5-6) with each thread making multiple calls the getImage() the code crashes

    for each thread I am passing a new QWebPage and using QWebPgae.moveToThread().

    code getImage()~~

    @ public void getImage(String str, int width, String fname,
    boolean istransparent) {

    QSize qSize = new QSize(width,height);

    page.setViewportSize(qSize);
    str = applyStyle(str);

    page.mainFrame().setHtml(str);
    String imageName = fname + "_" + width + "x"
    + page.mainFrame().contentsSize().height() + ".png";

    System.out.println("Creating Full Image : " + imageName);
    page.setViewportSize(page.mainFrame().contentsSize());

    QImage qImage = new QImage(page.mainFrame().contentsSize(),
    QImage.Format.Format_ARGB32);

    QPainter painter = new QPainter(qImage);

    page.mainFrame().render(painter);
    if (istransparent)
    makeTransparent(qImage);

    qImage.save(imageName);
    painter.end();

    qImage.dispose();

    }

    @

    ~~~~~~~~~~~~~~~DUMP~~~~~~~~~~~~~~~~~
    

    @

    An unexpected error has been detected by Java Runtime Environment:

    SIGSEGV (0xb) at pc=0x03534417, pid=6123, tid=1902168976

    Java VM: OpenJDK Server VM (1.6.0-b09 mixed mode linux-x86)

    Problematic frame:

    C [libQtWebKit.so.4+0x567417]

    If you would like to submit a bug report, please visit:

    http://icedtea.classpath.org/bugzilla

    The crash happened outside the Java Virtual Machine in native code.

    See problematic frame for where to report the bug.

    @

    @"COMPLETE CORE DUMP AT":http://freetexthost.com/1dtmb03qup
    @



  • Please don't double-post. I have deleted the duplicate of this posting that you put in General and Desktop.



  • QtWebkit classes are GUI classes and as such they are meant to be used from the main thread only.



  • I am passing a new instance of QWebPage to each thread
    MyClass contains imageGenerator()

    @.....in main()...
    QWepPage page = new QWebPage();
    MyClass m = new MyClass();
    QThread thread = new QThread(m)

    page.moveToThread(thread);

    thread.start();
    .....
    @



  • [quote author="ananya" date="1314020743"]I am passing a new instance of QWebPage to each thread
    [/quote]

    I just can emphasize what peppe wrote:

    [quote author="peppe" date="1314019276"]QtWebkit classes are GUI classes and as such they are meant to be used from the main thread only.[/quote]

    So, you must not move the web page to another thread.



  • Is there any work around for this then? while still keeping it multi threaded?

    p.s.
    i've found that the part of code that is causing the crash is
    @page.mainFrame().setHtml(str);@



  • [quote author="ananya" date="1314022398"]Is there any work around for this then? while still keeping it multi threaded?[/quote]

    Sure, if you don't mind what you are trying to achieve, we can give advice.



  • I am trying to make an application to convert text to image ...one requirement is that i should be able to run multiple threads since i plan to integrate this with a web server



  • It's not possible with Qt. Can't you just run multiple processes?



  • All you can do is running multiple threads that collect the data (HTML pages) and send that to the QWebPage instances in the main thread.



  • [quote author="Volker" date="1314056869"]All you can do is running multiple threads that collect the data (HTML pages) and send that to the QWebPage instances in the main thread.[/quote]

    that wont really serve my purpose of generating images in parallel

    [quote author="peppe" date="1314023870"]It's not possible with Qt. Can't you just run multiple processes?[/quote]

    will try to run it as a process..and get back



  • [quote author="ananya" date="1314062413"]
    [quote author="Volker" date="1314056869"]All you can do is running multiple threads that collect the data (HTML pages) and send that to the QWebPage instances in the main thread.[/quote]

    that wont really serve my purpose of generating images in parallel

    [quote author="peppe" date="1314023870"]It's not possible with Qt. Can't you just run multiple processes?[/quote]

    will try to run it as a process..and get back
    [/quote]

    Suppose i use Callable instead of Runnable threads
    Is it possible to initialize a new QApplication within each callable's call...when i'm trying this only the first callable runs..the others crash



  • You can only have one Q(Core)Application instance. You might delete the instance and create a new but ... there can be only one!



  • "You can only have one Q(Core)Application instance. You might delete the instance and create a new but … there can be only one!"

    How to do this? please help


Log in to reply