Да, лучший способ - преобразовать нотацию объекта в плоское представление строки значения ключа, как указано в этом комментарии: 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, просто хотелось выделить альтернативный модуль.
Вкратце: FValue
в вашем TMythread
в принципе будет доступен из всех потоков, но только если им каким-то образом удастся пройти через стену "private
". Так что на самом деле это просто поле объекта, как и любое другое поле объекта.
Однако threadvar
больше похож на глобальную переменную и доступен также. За исключением того, что каждый поток получает свой собственный экземпляр объявленного threadvar
.
немного больше предыстории: Переменная threadvar «создается», когда поток «рождается». Начальный поток фактически даже не должен запускаться с использованием класса TThread
!. (например, вы можете начать новый поток, используя системный вызов winapi)
Некоторое время назад я нашел это нелегко, потому что создал утечку памяти и с трудом выяснил, почему. Также: вы не можете инициализировать и завершить threadvar
в разделах initialization
/ finalization
декларирования unit
. Даже внутренние строки и массивы с подсчетом ссылок вызовут утечку памяти при использовании в качестве threadvar, и не будут явно аннулированы потоком-владельцем до того, как поток «умрет».
AFAIK, вы не можете объявить threadvar
внутри class
. Может быть, вы можете создать class threadvar
, но я никогда не пробовал / не нуждался в этом.
ИМО, как правило, «лучше», чем использование threadvar
. Некоторым хорошим началом для использования потоков в delphi является предоставляемая параллельная библиотека delphi или библиотека OmniThread с открытым исходным кодом .