Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: CreateThread - проблемы выполнения  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1424
Андрей Игоревич,

function TestThread1(Prarameters:Pointer): Integer;
Begin
  Result := 0;
  New(LocalData);
  LocalData^ := Prarameters^;
  LocalData.Data1 := 4321;
  Sleep(200);
  //...
  Sendmessage (MainHandle, WM_DATA_UPDATE, 123, Integer(@MessageData) );
  EndThread(0);
End;
31 июл 20, 16:57    [22176327]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50756

Андрей Игоревич
Если бы там были локальные переменные, такого бы не произошло, осталось бы значение 0. Или
я всё ещё продолжаю что-то не понимать.

Походу да, ты продолжаешь не понимать, что у тебя локальные переменные - указатели на
глобальный кусок памяти.

Posted via ActualForum NNTP Server 1.5

31 июл 20, 17:09    [22176336]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
Dimitry Sibiryakov

Андрей Игоревич
Если бы там были локальные переменные, такого бы не произошло, осталось бы значение 0. Или
я всё ещё продолжаю что-то не понимать.

Походу да, ты продолжаешь не понимать, что у тебя локальные переменные - указатели на
глобальный кусок памяти.

Ну дак я о том и пишу. Но вот что пишут на delphibasics
http://www.delphibasics.ru/BeginThread.php
// Указываем указатель на переданные данные
// Обратите внимание, что каждый поток имеет отдельную копию msgPtr

или товарищи форумчане
YuRock
Андрей Игоревич
Но ^TMsgRecord указатель на тот же участок памяти, отдельных копий же нет?
Именно отдельные копии и будут для каждого потока при threadvar.

А я не вижу копий, я вижу копию указателя. Потому и спрашиваю.

Zelius
Андрей Игоревич,

function TestThread1(Prarameters:Pointer): Integer;
Begin
  Result := 0;
  New(LocalData);
  LocalData^ := Prarameters^;
  LocalData.Data1 := 4321;
  Sleep(200);
  //...
  Sendmessage (MainHandle, WM_DATA_UPDATE, 123, Integer(@MessageData) );
  EndThread(0);
End;

Ну это понятно, но проще уж тогда просто переменную в ThreadVar сразу забить, кода меньше будет.
31 июл 20, 17:48    [22176358]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50756

Андрей Игоревич
Ну дак я о том и пишу.

delphibasics
// Указываем указатель на переданные данные
// Обратите внимание, что каждый поток имеет отдельную копию msgPtr (этого указателя -
прим.ред)

форумчане
Именно отдельные копии (указателя - прим.ред) и будут для каждого потока при threadvar.

Ну, вы все пишете одно и то же. Что именно тебя смущает-то?..

Posted via ActualForum NNTP Server 1.5

31 июл 20, 17:58    [22176362]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2349
А в чем нужда велосипед изобретать? Давно есть высокоуровневые обертки...
31 июл 20, 18:00    [22176363]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
Dimitry Sibiryakov

delphibasics
// Указываем указатель на переданные данные
// Обратите внимание, что каждый поток имеет отдельную копию msgPtr (этого указателя -
прим.ред)



Ну дак во втором предложении суть, там указывают указатель (как коряво звучит), но получают отдельную копию. В указанном примере нет отдельной копии msgPtr, только "ссылка" на него в памяти.
// Указываем указатель на переданные данные
// Обратите внимание, что каждый поток имеет отдельную копию msgPtr

Или фраза "отдельная копия указателя объекта" и "отдельная копия объекта" это одно и то же?

Ладно, суть я уже банальным тестированием понял, обновлять главный поток будут через Showmessage. Жаль нет способа поудобнее, всё таки очень громоздко передавать сообщения, мне BeginThread как раз и заинтересовала тем, что намного компактнее, чем класс TThread, а так уже и не так компактно.

white_nigger
А в чем нужда велосипед изобретать? Давно есть высокоуровневые обертки...

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

Сообщение было отредактировано: 31 июл 20, 18:05
31 июл 20, 18:08    [22176370]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50756

Андрей Игоревич
В указанном примере нет отдельной копии msgPtr, только "ссылка" на него в памяти.

Бредить не надо. Нет там никакой ссылки. Оператор присваивания копирует значение указателя
в локальную переменную. Всё.

Posted via ActualForum NNTP Server 1.5

31 июл 20, 18:11    [22176371]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
Dimitry Sibiryakov

Андрей Игоревич
В указанном примере нет отдельной копии msgPtr, только "ссылка" на него в памяти.

Бредить не надо. Нет там никакой ссылки. Оператор присваивания копирует значение указателя
в локальную переменную. Всё.

Это я про "физический смысл" указателя. "Ссылка" на ячейку в памяти. Ладно, это уже не важно.
31 июл 20, 18:26    [22176375]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50756

Андрей Игоревич
Это я про "физический смысл" указателя. "Ссылка" на ячейку в памяти.

Почувствуйте разницу между операторами ":=" и "@".

Posted via ActualForum NNTP Server 1.5

31 июл 20, 18:45    [22176381]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1155
Андрей Игоревич

white_nigger
А в чем нужда велосипед изобретать? Давно есть высокоуровневые обертки...

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


Ничего там компактного нет! На первый взгляд так может показаться. А код автоматически становится сложнее, используется тип Pointer, который каждый интерпретирует по своему. Таким потоком сложнее управлять. В голову лезут безумные идеи написания кода, в том числе с использованием threadvar.
31 июл 20, 21:36    [22176425]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4235
DmSer
Андрей Игоревич

пропущено...

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


Ничего там компактного нет! На первый взгляд так может показаться. А код автоматически становится сложнее, используется тип Pointer, который каждый интерпретирует по своему. Таким потоком сложнее управлять. В голову лезут безумные идеи написания кода, в том числе с использованием threadvar.
По своему опыту, могу сказать, что польза от "ручного" использования Begin/CreateThread одна (с другими неудобствами я не сталкивался) : можно указать размер стека - это бывает важно (странно, что в TThread не добавили поля для указания в конструкторе при необходимости).
По-умолчанию потоку под стек мегабайт выделяется обычно, хотя часто за глаза несколько десятков кб хватит. Для 32-бит программ это может быть чрезвычайно критично при запуске нескольких сотен потоков, уж про тысячу не говорю.
1 авг 20, 00:32    [22176445]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4235
DmSer
Андрей Игоревич

пропущено...

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


Ничего там компактного нет! На первый взгляд так может показаться. А код автоматически становится сложнее, используется тип Pointer, который каждый интерпретирует по своему. Таким потоком сложнее управлять. В голову лезут безумные идеи написания кода, в том числе с использованием threadvar.
По своему опыту, могу сказать, что польза от "ручного" использования Begin/CreateThread одна (с другими неудобствами я не сталкивался) : можно указать размер стека - это бывает важно (странно, что в TThread не добавили поля для указания в конструкторе при необходимости).
По-умолчанию потоку под стек мегабайт выделяется обычно, хотя часто за глаза несколько десятков кб хватит. Для 32-бит программ это может быть чрезвычайно критично при запуске нескольких сотен потоков, уж про тысячу не говорю.
1 авг 20, 00:32    [22176446]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1155
По-умолчанию потоку под стек мегабайт выделяется обычно, хотя часто за глаза несколько десятков кб хватит. Для 32-бит программ это может быть чрезвычайно критично при запуске нескольких сотен потоков, уж про тысячу не говорю


64-битная винда добавит ещё по 256 КБ на каждый поток.
1 авг 20, 08:56    [22176480]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50756

DmSer
64-битная винда добавит ещё по 256 КБ на каждый поток.

Она, к счастью, даст ещё и офигенного размера адресное пространство, которое позволит не
заботиться о таких мелочах.

Posted via ActualForum NNTP Server 1.5

1 авг 20, 13:01    [22176513]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1155
Dimitry Sibiryakov

DmSer
64-битная винда добавит ещё по 256 КБ на каждый поток.

Она, к счастью, даст ещё и офигенного размера адресное пространство, которое позволит не
заботиться о таких мелочах.


К сожалению , если приложение 32-битное, для него сужается адресное пространство в 64-битной винде.

Если приложение 64-битное, то про размер стека и адресное пространство можно не задумываться.
1 авг 20, 14:10    [22176531]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
DmSer
Андрей Игоревич

пропущено...

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


Ничего там компактного нет! На первый взгляд так может показаться. А код автоматически становится сложнее, используется тип Pointer, который каждый интерпретирует по своему. Таким потоком сложнее управлять. В голову лезут безумные идеи написания кода, в том числе с использованием threadvar.

Жуть какая. Буду осторожнее. :)
1 авг 20, 16:26    [22176545]     Ответить | Цитировать Сообщить модератору
 Re: CreateThread - проблемы выполнения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50756

Андрей Игоревич
Буду осторожнее. :)

Да, всеми силами избегай написания кода. Там могут завестись идеи.

Posted via ActualForum NNTP Server 1.5

1 авг 20, 16:54    [22176548]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить