Delphi - разница между Threadvar и приватной переменной потока

Да, лучший способ - преобразовать нотацию объекта в плоское представление строки значения ключа, как указано в этом комментарии: https://stackoverflow.com/a/39357531/2529199

Я хотел выделить альтернативный метод, используя эту библиотеку NPM: https://www.npmjs.com/package/dot-object , который позволяет вам манипулировать различными объектами с использованием точечной нотации.

Я использовал этот шаблон для программного создания свойства вложенного объекта при принятии значения ключа в качестве функциональной переменной следующим образом:

const dot = require('dot-object');

function(docid, varname, varvalue){
  let doc = dot.dot({
      [varname]: varvalue 
  });

  Mongo.update({_id:docid},{$set:doc});
}

Этот шаблон позволяет мне использовать вложенные как одноуровневые свойства взаимозаменяемо и вставлять их в Mongo.

Если вам нужно поиграть с объектами JS за пределами Mongo, особенно на стороне клиента, но иметь согласованность при работе с Mongo, эта библиотека дает вам больше возможностей, чем ранее упомянутый модуль mongo-dot-notation NPM.

PS Мне изначально хотелось просто упомянуть об этом в качестве комментария, но, судя по всему, моя реплика S / O недостаточно высока, чтобы p ost комментарий. Так что, не пытаясь вникать в комментарий SzybkiSasza, просто хотелось выделить альтернативный модуль.

1
задан NamoRamana 17 January 2019 в 16:41
поделиться

1 ответ

Вкратце: FValue в вашем TMythread в принципе будет доступен из всех потоков, но только если им каким-то образом удастся пройти через стену "private". Так что на самом деле это просто поле объекта, как и любое другое поле объекта.

Однако threadvar больше похож на глобальную переменную и доступен также. За исключением того, что каждый поток получает свой собственный экземпляр объявленного threadvar.

немного больше предыстории: Переменная threadvar «создается», когда поток «рождается». Начальный поток фактически даже не должен запускаться с использованием класса TThread !. (например, вы можете начать новый поток, используя системный вызов winapi)

Некоторое время назад я нашел это нелегко, потому что создал утечку памяти и с трудом выяснил, почему. Также: вы не можете инициализировать и завершить threadvar в разделах initialization / finalization декларирования unit. Даже внутренние строки и массивы с подсчетом ссылок вызовут утечку памяти при использовании в качестве threadvar, и не будут явно аннулированы потоком-владельцем до того, как поток «умрет».

AFAIK, вы не можете объявить threadvar внутри class. Может быть, вы можете создать class threadvar, но я никогда не пробовал / не нуждался в этом.

ИМО, как правило, «лучше», чем использование threadvar. Некоторым хорошим началом для использования потоков в delphi является предоставляемая параллельная библиотека delphi или библиотека OmniThread с открытым исходным кодом .

0
ответ дан H.Hasenack 17 January 2019 в 16:41
поделиться
Другие вопросы по тегам:

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