|
|
|
Параметризированный TThread.Queue
|
|||
|---|---|---|---|
|
#18+
Это замечательно, что есть TThread.Queue Но каким образом передать туда параметры В качестве теста использую такую конструкцию. И надеюсь, что refernce делает свою копию данных Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Данным тестом я надеюсь получить значение 100500, как некое локальное Но нет, в Caption выводится 500. Т.е. по факту параметр не только не сохраняется, но и используется грязное значение из стека Тогда как правильно передать параметр? Что если это составной параметр: структура или экземпляр класса? У нас есть 2 варианта функции: Код: pascal 1. 2. 3. 4. 5. Какие варианты решения я вижу. Вариант 1: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Чем плох такой вариант решения. Тем, что у Thread есть функция RemoveQueuedEvents Так вот этот функция удалит сообщения из очереди, но Dispose (или Free) передаваемым параметрам вызвано не будет. Что мягко говоря приведёт к утечкам памяти. Второй вариант жёстче. Reference to procedure является интерфейсом с методом Invoke. Т.е. я могу унаследоваться от TInterfacedObject, реализовать метод Invoke и всё это упаковывать в TThreadProcedure. Но это слишком трешово на мой взгляд. А как это сделать цивилизованно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2017, 19:04:26 |
|
||
|
Параметризированный TThread.Queue
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUТогда как правильно передать параметр?Не изменять его. Или попробовать, по типу JavaScript обернуть в замыкание SOFT FOR YOU Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2017, 19:30:28 |
|
||
|
Параметризированный TThread.Queue
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, А тебе точно нужно передавать значение асинхронно ? Ну и как вариант - сделай локальную переменную, присвой ей значение и её уже используй. И не меняй, пока Queue не отработает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2017, 19:41:06 |
|
||
|
Параметризированный TThread.Queue
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Толковое решение Благодарю! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2017, 19:48:29 |
|
||
|
Параметризированный TThread.Queue
|
|||
|---|---|---|---|
|
#18+
Объясните, пожалуйста, момент http://docwiki.embarcadero.com/Libraries/XE5/en/System.Classes.TThread.Queue System.Classes.TThread.Queue Asynchronously executes a method call within the main thread. Тогда почему я сразу попадаю в первую точку останова, а не во вторую? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2017, 23:11:44 |
|
||
|
Параметризированный TThread.Queue
|
|||
|---|---|---|---|
|
#18+
Квейд, Если Queue вызывается из главного потока, то функция не кладётся в очередь, а выполняется сразу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2017, 00:01:42 |
|
||
|
Параметризированный TThread.Queue
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUЕсли Queue вызывается из главного потока, то функция не кладётся в очередь, а выполняется сразуWarning: Do not call Queue from within the main thread. This can cause an infinite loop. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2017, 00:37:46 |
|
||
|
Параметризированный TThread.Queue
|
|||
|---|---|---|---|
|
#18+
А вообще - самая полезная функция для синхронизация с основным потоком. У нас плотно используется в RichEditControl для обновления из потоков, в том числе с нарезкой потока с использонием WaitForMultipleObjects. А то тут некоторые панику поднимали, что такое сделать нельзя... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2017, 00:48:44 |
|
||
|
Параметризированный TThread.Queue
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUКвейд, Если Queue вызывается из главного потока, то функция не кладётся в очередь, а выполняется сразу Спасибо. Я решил, что Queue даже из главного потока выполнится отложенно. Надо читать справку до конца :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2017, 12:50:53 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39542363&tid=2041684]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
418ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 694ms |

| 0 / 0 |
