Thanks for getting back to me. :) Yes, the code is a c++ and not a JS
library, so MAIN_THREAD_EM_ASM can be useful. But I have no idea yet how to
make it work with that.

Best,
Balázs

'Sam Clegg' via emscripten-discuss <[email protected]>
ezt írta (időpont: 2022. okt. 13., Cs, 18:35):

> It looks like that API only works on the main thread (since it uses the
> DOM).
>
> If you really need to call such APIs on a background thread there are
> various ways to proxy the work back to the main thread.  See
> https://emscripten.org/docs/porting/pthreads.html#proxying.   If the code
> in question is not a JS library (e.g. if its written in EM_JS or EM_ASM)
> you can use `MAIN_THREAD_EM_ASM` and/or
> `emscripten_sync_run_in_main_thread` helpers.
>
> cheers,
> sam
>
>
> On Thu, Oct 13, 2022 at 8:31 AM Balázs Varga <[email protected]>
> wrote:
>
>> Hi!
>>
>> I run into a problem with
>> QFileDialog::getOpenFileContent function, which are use to access to the
>> local filesystem with emscripten:
>> https://doc.qt.io/qt-5/qfiledialog.html#getOpenFileContent
>>
>> I tried to call it on a different thread then what on the wasm
>> application is running:
>> std::thread th1 (QFileDialog::getOpenFileContent, "*.*", onFileReady);
>> th1.join();
>>
>> But in that case, it froze at the emscripten part in the openFileDialog
>> function and no file dialogue was opened.
>> emscripten::val document = emscripten::val::global("document");
>> emscripten::val input = document.call<emscripten::val>("createElement",
>> std::string("input"));
>>
>>
>> *I got the error message at creating the input value.*
>>
>> *https://codereview.qt-project.org/c/qt/qtbase/+/250461/7/src/gui/platform/wasm/qwasmlocalfileaccess.cpp#129*
>> <https://codereview.qt-project.org/c/qt/qtbase/+/250461/7/src/gui/platform/wasm/qwasmlocalfileaccess.cpp#129>
>>
>> Running on the main thread there is no error and works fine.
>> Any idea what could be the problem/solution here?
>> I got this error message:
>>
>> worker.js onmessage() captured an uncaught exception: TypeError: Cannot
>> read properties of undefined (reading 'createElement')
>> self.onmessage @ soffice.worker.js:207
>> soffice.worker.js:208 TypeError: Cannot read properties of undefined
>> (reading 'createElement')
>>     at methodCaller_emscripten$$val_$std$$string$ (eval at new_
>> (47933e67-c694-46fe-af70-91dc8b50859c:8694:27), <anonymous>:5:20)
>>     at __emval_call_method (47933e67-c694-46fe-af70-91dc8b50859c:9267:14)
>>     at emscripten::internal::MethodCaller<emscripten::val,
>> std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> > >::call(emscripten::internal::_EM_VAL*, char
>> const*, std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char>
>> emscripten::internal::MethodCaller<emscripten::val,
>> std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> > >::call(emscripten::internal::_EM_VAL*, char
>> const*, std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> >&&) (val.h:278)
>>     at emscripten::val emscripten::val::call<emscripten::val,
>> std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> > >(char const*, std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> >&&) emscripten::val
>> emscripten::val::call<emscripten::val, std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > >(char const*,
>> std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> >&&) const (val.h:498)
>>     at QWasmLocalFileAccess::openFileDialog(std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > const&,
>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void
>> (qstdweb::FileList const&)>
>> QWasmLocalFileAccess::openFileDialog(std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > const&,
>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void
>> (qstdweb::FileList const&)> const&) (qwasmlocalfileaccess.cpp:131)
>>     at QWasmLocalFileAccess::openFiles(std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > const&,
>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void (int)>
>> const&, std::__2::function<char* (unsigned long long,
>> std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> >)> const&, std::__2::function<void ()>
>> QWasmLocalFileAccess::openFiles(std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > const&,
>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void (int)>
>> const&, std::__2::function<char* (unsigned long long,
>> std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> >)> const&, std::__2::function<void ()> const&)
>> (qwasmlocalfileaccess.cpp:156)
>>     at QWasmLocalFileAccess::openFile(std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > const&,
>> std::__2::function<void (bool)> const&, std::__2::function<char* (unsigned
>> long long, std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> >)> const&, std::__2::function<void ()>
>> QWasmLocalFileAccess::openFile(std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > const&,
>> std::__2::function<void (bool)> const&, std::__2::function<char* (unsigned
>> long long, std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> >)> const&, std::__2::function<void ()> const&)
>> (qwasmlocalfileaccess.cpp:169)
>>     at QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> QFileDialog::getOpenFileContent(QString const&, std::__2::function<void
>> (QString const&, QByteArray const&)> const&)::$_2::operator()()
>> (qfiledialog.cpp:2444)
>>     at decltype(std::__2::forward<QFileDialog::getOpenFileContent(QString
>> const&, std::__2::function<void (QString const&, QByteArray const&)>
>> const&)::$_2&>(fp)())
>> std::__2::__invoke<QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> decltype(std::__2::forward<QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> const&)::$_2&>(fp)())
>> std::__2::__invoke<QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)> const&)::$_2&)
>> (type_traits:3694)
>>     at void std::__2::__invoke_void_return_wrapper<void,
>> true>::__call<QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)> void
>> std::__2::__invoke_void_return_wrapper<void,
>> true>::__call<QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)> const&)::$_2&)
>> (__functional_base:348)worker.js onmessage() captured an uncaught
>> exception: TypeError: Cannot read properties of undefined (reading
>> 'createElement')
>> self.onmessage @ soffice.worker.js:207
>> soffice.worker.js:208 TypeError: Cannot read properties of undefined
>> (reading 'createElement')
>>     at methodCaller_emscripten$$val_$std$$string$ (eval at new_
>> (47933e67-c694-46fe-af70-91dc8b50859c:8694:27), <anonymous>:5:20)
>>     at __emval_call_method (47933e67-c694-46fe-af70-91dc8b50859c:9267:14)
>>     at emscripten::internal::MethodCaller<emscripten::val,
>> std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> > >::call(emscripten::internal::_EM_VAL*, char
>> const*, std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char>
>> emscripten::internal::MethodCaller<emscripten::val,
>> std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> > >::call(emscripten::internal::_EM_VAL*, char
>> const*, std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> >&&) (val.h:278)
>>     at emscripten::val emscripten::val::call<emscripten::val,
>> std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> > >(char const*, std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> >&&) emscripten::val
>> emscripten::val::call<emscripten::val, std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > >(char const*,
>> std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> >&&) const (val.h:498)
>>     at QWasmLocalFileAccess::openFileDialog(std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > const&,
>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void
>> (qstdweb::FileList const&)>
>> QWasmLocalFileAccess::openFileDialog(std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > const&,
>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void
>> (qstdweb::FileList const&)> const&) (qwasmlocalfileaccess.cpp:131)
>>     at QWasmLocalFileAccess::openFiles(std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > const&,
>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void (int)>
>> const&, std::__2::function<char* (unsigned long long,
>> std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> >)> const&, std::__2::function<void ()>
>> QWasmLocalFileAccess::openFiles(std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > const&,
>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void (int)>
>> const&, std::__2::function<char* (unsigned long long,
>> std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> >)> const&, std::__2::function<void ()> const&)
>> (qwasmlocalfileaccess.cpp:156)
>>     at QWasmLocalFileAccess::openFile(std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > const&,
>> std::__2::function<void (bool)> const&, std::__2::function<char* (unsigned
>> long long, std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> >)> const&, std::__2::function<void ()>
>> QWasmLocalFileAccess::openFile(std::__2::basic_string<char,
>> std::__2::char_traits<char>, std::__2::allocator<char> > const&,
>> std::__2::function<void (bool)> const&, std::__2::function<char* (unsigned
>> long long, std::__2::basic_string<char, std::__2::char_traits<char>,
>> std::__2::allocator<char> >)> const&, std::__2::function<void ()> const&)
>> (qwasmlocalfileaccess.cpp:169)
>>     at QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> QFileDialog::getOpenFileContent(QString const&, std::__2::function<void
>> (QString const&, QByteArray const&)> const&)::$_2::operator()()
>> (qfiledialog.cpp:2444)
>>     at decltype(std::__2::forward<QFileDialog::getOpenFileContent(QString
>> const&, std::__2::function<void (QString const&, QByteArray const&)>
>> const&)::$_2&>(fp)())
>> std::__2::__invoke<QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> decltype(std::__2::forward<QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> const&)::$_2&>(fp)())
>> std::__2::__invoke<QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)> const&)::$_2&)
>> (type_traits:3694)
>>     at void std::__2::__invoke_void_return_wrapper<void,
>> true>::__call<QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)> void
>> std::__2::__invoke_void_return_wrapper<void,
>> true>::__call<QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)>
>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&,
>> std::__2::function<void (QString const&, QByteArray const&)> const&)::$_2&)
>> (__functional_base:348)
>>
>> Thanks in advance,
>> Balazs
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "emscripten-discuss" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/emscripten-discuss/0b5c70fa-8cd2-4705-a64c-4816c1189dccn%40googlegroups.com
>> <https://groups.google.com/d/msgid/emscripten-discuss/0b5c70fa-8cd2-4705-a64c-4816c1189dccn%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
> --
> You received this message because you are subscribed to the Google Groups
> "emscripten-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/emscripten-discuss/CAL_va29QkPT_WVX_fsj1qe8keQ_serFRrgF72kmYtMshw7N2dA%40mail.gmail.com
> <https://groups.google.com/d/msgid/emscripten-discuss/CAL_va29QkPT_WVX_fsj1qe8keQ_serFRrgF72kmYtMshw7N2dA%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/emscripten-discuss/CAHt2gK-BrW997oNmafS3wQma1z82vkbDS%2BZsj21pT43QT1hwMg%40mail.gmail.com.

Reply via email to