Как отправить сообщение в TThread от основного потока в Delphi?

Я использую GDB для отладки вашей программы. Сообщения об ошибках следующие.

Стек, который вы применили для дочернего элемента, возможно, был освобожден до реального выполнения fprintf в дочерней функции.

В дочерней функции добавьте fflush(stdout); после того, как утверждение может решить вашу проблему.

Continuing.
Allocate stack for new process
stack = 0x602010, stack top = 0x6027df
clone
The new process is created.
sleep for 20 secs
clone returns
Free the stack
*** Error in `test': double free or corruption (out): 0x0000000000602010 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7ffff7a847e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7ffff7a8d37a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7ffff7a9153c]
/***/***/tmp/test[0x400969]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7ffff7a2d830]
/***/***/tmp/test[0x400729]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:21 12848672                           /***/***/tmp/test
00600000-00601000 r--p 00000000 08:21 12848672                           /***/***/tmp/test
00601000-00602000 rw-p 00001000 08:21 12848672                           /***/***/tmp/test
00602000-00623000 rw-p 00000000 00:00 0                                  [heap]
7ffff0000000-7ffff0021000 rw-p 00000000 00:00 0
7ffff0021000-7ffff4000000 ---p 00000000 00:00 0
7ffff77f7000-7ffff780d000 r-xp 00000000 08:01 786957                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff780d000-7ffff7a0c000 ---p 00016000 08:01 786957                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff7a0c000-7ffff7a0d000 rw-p 00015000 08:01 786957                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff7a0d000-7ffff7bcd000 r-xp 00000000 08:01 791529                     /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7bcd000-7ffff7dcd000 ---p 001c0000 08:01 791529                     /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7dcd000-7ffff7dd1000 r--p 001c0000 08:01 791529                     /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7dd1000-7ffff7dd3000 rw-p 001c4000 08:01 791529                     /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7dd3000-7ffff7dd7000 rw-p 00000000 00:00 0
7ffff7dd7000-7ffff7dfd000 r-xp 00000000 08:01 791311                     /lib/x86_64-linux-gnu/ld-2.23.so
7ffff7fd3000-7ffff7fd6000 rw-p 00000000 00:00 0
7ffff7ff7000-7ffff7ff8000 rw-p 00000000 00:00 0
7ffff7ff8000-7ffff7ffa000 r--p 00000000 00:00 0                          [vvar]
7ffff7ffa000-7ffff7ffc000 r-xp 00000000 00:00 0                          [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00025000 08:01 791311                     /lib/x86_64-linux-gnu/ld-2.23.so
7ffff7ffd000-7ffff7ffe000 rw-p 00026000 08:01 791311                     /lib/x86_64-linux-gnu/ld-2.23.so
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

Program received signal SIGSEGV, Segmentation fault.
__GI_abort () at abort.c:125
125     abort.c: No such file or directory.
8
задан Sebastian Zartner 5 August 2014 в 10:41
поделиться

3 ответа

Я даже не попытаюсь объяснить или написать любой код. Только посмотрите на это учебное руководство. Это немного старо, но очень хорошо, по моему скромному мнению. Многопоточность - Delphi Путь

6
ответ дан 5 December 2019 в 11:28
поделиться

Вы можете или иметь цикл сообщения (возможно со скрытым окном уведомления) в Вашем потоке и отправить сообщение Windows в него, или можно использовать более собственное (меньшее-количество-GUI) способ сделать его, такие как очередь, защищенная критическим разделом, объединенным со сброшенным руководством событием, что поток ожидает на и передающие сигналы потока.

Более общим решением является очередь производителя-потребителя, которая в классической реализации использует несколько семафоров для отслеживания потребителей и производителей и третий семафор для взаимоисключающего доступа к очереди; однако, более оптимальные очереди производителя-потребителя доступны в сети.

6
ответ дан 5 December 2019 в 11:28
поделиться

Почему необходимо было бы сделать это? Это только по одной причине, что я когда-либо должен был создавать цикл сообщения во вторичном потоке, и это вызвано тем, что поток использовал COM-объекты. Вызовы к OleInitialize () и OleUnitialize () являются знаком, что Вам нужен стандартный GetMessage () цикл. В этом случае также необходимо просто добавить сообщения к тому потоку, с помощью PostThreadMessage (), потому что нормальные вызовы синхронизации блокирования вмешались бы в цикл сообщения. Иначе просто не делайте этого.

Если Вы - в Delphi 2007 или 2009, несомненно, изучат OmniThreadLibrary Primož Gabrijelčič, это должно сделать Ваше задание намного легче.

3
ответ дан 5 December 2019 в 11:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: