|
|
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть следующий демокод: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. прогнозируемо aErrorMsg:=ThreadJob.ErrorMsg; и aIsMailSended:=ThreadJob.IsMailSended; выводят "ничего" в выше стоящий код Вопрос : как правильно вывести результат работы потока в обработчики но без "Synchronize" и прочего из той же оперы а через "property". если такое для потока вообще возможно. что то читал про OnTerminate но ничего канкретно применительно к "property" не нашлось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 16:12 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Pcrepair, ИМХО, проще всего отправить сообщение об окончании работы потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 16:18 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
лутше всего вначале прочитать топик а потом писАть ответ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 16:22 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Pcrepair, защищать доступ критическими секциями. но тут другая проблема, поток самоуничтожаем, поэтому в момент считывания его может и не быть уже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 16:55 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
PcrepairВопрос : как правильно вывести результат работы потока в обработчики но без "Synchronize" и прочего из той же оперы а через "property". если такое для потока вообще возможно. что то читал про OnTerminate но ничего канкретно применительно к "property" не нашлось. А что вы хотите "вывести" из потока, если у вас в конструкторе "FreeOnTerminate := True;"? Как только завершается выполнение Thred.Execute(), то у вас поток уже не существует. Это во-первых. Во-вторых: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. ИМХО почитайте справку про TThread.WaitFor и вообще статьи на тему взаимодействия потоками, т.к. непонятно зачем в вашем случае он вообще нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 17:16 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Pcrepair, Я по коду ориентировался, если в конце Execute сделать SendMessage, то поток не уничтожится пока не буде обработано сообщение об окончании работы потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 17:41 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Сложно сказать, что именно нужно. Но пока что послать синхронное сообщение об окончании - лучшая идея. Иначе можем напороться на отсутствующий экземпляр, со всеми последствиями. Либо где-то снаружи результат запоминать, что явно хуже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 18:57 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
неужто никто топик до конца не читает? авторВопрос : как правильно вывести результат работы потока в обработчики но без "Synchronize" и прочего из той же оперы а через "property". если такое для потока вообще возможно. что то читал про OnTerminate но ничего канкретно применительно к "property" не нашлось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 19:16 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
PcrepairВопрос : как правильно вывести результат работы потока в обработчики но без "Synchronize" и прочего из той же оперы а через "property". Вопрос звучит примерно так: "Как мне доехать на автомобиле из Москвы в Ленинград, но без бензина и прочего из той же серии, а через руль?" К сожалению, Ваш текст показывает столь малое знакомство с предметом, что какой-либо осмысленный диалог практически невозможен. Если Вам быстро нужный результат, погуглите что-нибудь типа "как вернуть результат из потока в Delphi" и добросовестно скопируйте тот или иной пример, а если хотите разобраться и понимать происходящее - прочитайте базовые материалы по теме, тогда сможете задавать более осмысленные вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 19:28 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
а по существу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 19:31 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Pcrepair, авторнеужто никто топик до конца не читает? Вот вот :) авторЛибо где-то снаружи результат запоминать, что явно хуже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 19:57 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Pcrepairнеужто никто топик до конца не читает? авторВопрос : как правильно вывести результат работы потока в обработчики но без "Synchronize" и прочего из той же оперы а через "property". если такое для потока вообще возможно. что то читал про OnTerminate но ничего канкретно применительно к "property" не нашлось. OnTerminate вызывается в контексте главного потока, там ничего защищать не надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 20:12 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Pcrepairа по существу? А по существу тут программист нужон (С) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 20:12 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
ну что же... а теперь для всех шибка грамотных и не очень, а также кому интересно ПРАВИЛЬНЫЙ ОТВЕТ! Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. данные входят и выходят. через параметры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 21:05 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Pcrepair, архигениально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 21:14 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
freeOnTerminate вовсе не убивает поток сразу после Execute поэтому абсолютно спокойно поток сходит в обработчик OnTerminate, как уже написано, в главном потоке там у него можно забрать результаты трудов а после этого он тихо умрет а то что вы написали, скорее всего надаёт AV, т.к. синхронизации никакой нет и то что ссылки на переменные вы пихаете через конструктор, ну ничего не меняет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 22:17 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Pcrepairну что же... а теперь для всех шибка грамотных и не очень, а также кому интересно ПРАВИЛЬНЫЙ ОТВЕТ! А теперь внимание, вопрос: нахрена там TThread, если код из Execute() можно напрямую запихнуть в ThreadDoJob() с тем же результатом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 22:40 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
А самое прикольное, это вот эта конструкция: Код: pascal 1. 2. 3. 4. 5. 6. Поток начнёт выполнение раньше, чем получит адрес хоста. А, учитывая что fHost - это строка, то адок будет тот ещё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 22:42 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
задача и была именно такой - напихать ссылки через конструктор. сказано ведь -ДЕМОКОД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 22:42 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Pcrepairзадача и была именно такой - напихать ссылки через конструктор. сказано ведь -ДЕМОКОД У этого демокода только одно применение - показать как не надо делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 22:45 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
а может и так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 22:47 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Pcrepair[src delphi] procedure ThreadDoJob(const aHost:string; var aErrorMsg:string; var aIsJobDone:Boolean); var ThreadJob:DoJob; begin ThreadJob:=DoJob.Create(aHost,aErrorMsg,aIsJobDone); ThreadJob.WaitFor; aErrorMsg:=ThreadJob.ErrorMsg; aIsJobDone:=ThreadJob.IsJobDone; ThreadJob.Destroy; end;осталось расставить try-finally alekcvpА теперь внимание, вопрос: нахрена там TThread, если код из Execute() можно напрямую запихнуть в ThreadDoJob() с тем же результатом? самое интересное я одно применение такому коду знаю (полезное имею ввиду, даже видел в проде), но врят ли ТС так глубоко копал. правды для : alekcvpПоток начнёт выполнение раньше, чем получит адрес хоста.не начнёт krapotkinа то что вы написали, скорее всего надаёт AV, т.к. синхронизации никакой нет и то что ссылки на переменные вы пихаете через конструктор, ну ничего не меняетне найдёт (если речь про 21467861 ), очень сильно меняет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 00:04 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Pcrepair, :facepalm: как обычно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 00:21 |
|
||
|
потоки(TThread) и свойства(property), не все понятно
|
|||
|---|---|---|---|
|
#18+
Pcrepairкак правильно вывести результат работы потока в обработчики но без "Synchronize" и прочего из той же оперы Как бы вам сказать... Работать с потоками без объектов синхронизации, это примерно как крутить барабан из 12 патронов с 11-ю заряженными у виска. Если вы реально не хотите ничего синхронизировать, тогда вам в помощь lockfree, но в вашем случае, это как слетать в магазин на шаттле. Вообще если вам надо выполнить работу и получить результат то можете сделать так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 00:25 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39655217&tid=2040750]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
152ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 516ms |

| 0 / 0 |
