Евгений Корепов

Пользователи
  • Публикации

    399
  • Зарегистрирован

  • Посещение

  • Days Won

    20

Евгений Корепов last won the day on 25 мая

Евгений Корепов had the most liked content!

О Евгений Корепов

  • Звание
    Продвинутый пользователь
  • День рождения 22 июля

Информация

  • Пол
    Мужчина
  • Город
    Ухта

Посетители профиля

861 просмотр профиля
  1. Можно и удалять. Но тогда не будут работать мои аналитические инструменты - частота запусков приложения, периоды активности и многое другое. У Равиля запрос добавления токена в базу вот такой: INSERT INTO PushTokens (`deviceToken`, `deviceID`, `platform`) VALUE ('$deviceToken', '$deviceID', '$platform') ON DUPLICATE KEY UPDATE `deviceToken` = '$deviceToken'"; У меня же он чуть сложнее: INSERT INTO gcm (`DeviceID`, `DeviceToken`, `City`, `last_update`, `add_date`, `RequestCount`, `Active`) VALUES ('$DeviceID','$DeviceToken','$City',NOW(),NOW(), 1, 1) ON DUPLICATE KEY UPDATE `DeviceToken` = '$DeviceToken', `City` = '$City', `last_update` = NOW(), `RequestCount` = `RequestCount` + 1, `Active` = 1 Таблица выглядит вот так CREATE TABLE `gcm` ( `id` int(11) NOT NULL AUTO_INCREMENT, `DeviceID` char(32) DEFAULT NULL, `DeviceToken` varchar(255) DEFAULT NULL, `City` varchar(100) DEFAULT NULL, `last_update` datetime DEFAULT NULL, `add_date` datetime DEFAULT NULL, `RequestCount` int(11) DEFAULT '1', `Active` bit(1) DEFAULT b'1', PRIMARY KEY (`id`), UNIQUE KEY `DeviceID_index` (`DeviceID`) USING BTREE ) ENGINE=MyISAM AUTO_INCREMENT=40337 DEFAULT CHARSET=utf8; Т.е. кроме всего прочего я вижу: Дату-время первого запуска приложения Дату-время последнего запуска приложения Количество запусков приложения Стоит ли еще приложение на этом устройстве (Active) На поле City не обращайте внимание...
  2. У девочки компьютера нет имени (в контексте сети), у него есть MAC адрес и IP адрес. Если под именами компьютеров вы имеете ввиду то что видите открывая папку Сеть на компьютере, то это как раз работа NETBIOS. Каждый компьютер под управлением Windows срёт в сеть широковещательными пакетами с криками "Это я, это я, я еще живой!". При адекватном администраторе это все отключено и заглушено, потому как в этой среде распространение вирусов максимально благоприятно. Но если вы хотите воспользоваться этим механизмом, то начните гуглить NETBIOS, или попробуйте послушать снифером порт 137 (TCP если не ошибаюсь). В теории слушая этот порт и разбирая полученные пакеты у вас будет список из связок "Имя компьютера"-"IP адрес". Имейте ввиду, что в сети более чем с двумя компьютерами на этот порт может валиться несколько сотен пакетов в секунду. И одно большое "Но" - гугль не любит микрософт, поэтому на всех не рутованных устройствах порты NETBIOS заблокированы от слова совсем, конечно же в целях безопасности.
  3. Название топика содержит ответ на ваш вопрос - TIdTCPClient, ключевое слово "TCP". Этот протокол адресует устройства (или интерфейсы) исключительно по IP адресу(IPv4 или IPv6). Компонент TIdTCPClient работает следующим образом - если TIdTCPClient.Host содержит IP адрес, все нормально, отправляем туда пакет, но если в TIdTCPClient.Host строка, то ресолвим ее в IP адрес и после этого отправляем пакет на полученный адрес. Разрешение (ресолвинг) DNS имен происходит по примерно такой цепочке : Если это localhost, то система без вопросов возвращает 127.0.0.1 Операционка смотрит свои локальные настройки (windows C:\Windows\System32\drivers\etc\hosts, unix /etc/hosts) Проверяется локальный кэш dns записей Делается запрос на DNS сервер Так же могут применяться экзотические или устаревшие методы, к примеру Windows NetBIOS Name Server (WINS server). И попробуйте перефразировать свой вопрос, уточните конкретную задачу, так будет проще понять что вам нужно.
  4. Потому что это служебное поле, за которое объект-владелец не в ответе. Для иного вы можете использовать Image2.AddObject() - в этом случае Image2 будет знать о своих "детях" (Image2.Children в количестве Image2.ChildrenCount) и при самоубийстве покарает и детей. А в случае TagObject он проигнорирует содержащийся там объект и возникнет утечка памяти. Воспринимайте TagObject как средство хранения ссылки на реально существующий в приложении объект, а не как место хранения самого объекта.
  5. В Windows ваш код работал "случайно", все дело в разных механизмах управления памятью на разных платформах и возможно в windows в какой то момент эти объекты тоже могут быть удалены. Использование TMemoryStream, в вашем случае, увеличивает накладные расходы - производится копирование участков памяти, кстати так же как и при использовании Assign (не что иное как копирование). Возможно стоит использовать обычное присвоение? Т.е. в пределах приложения хранить одну единственную копию картинки, и по мере надобности присваивать ее (Image2.Bitmap:=Image2.TagObject as TBitmap) нужным элементам. По поводу вот этого можете привести пример кода или пример приложения, где воспроизводится данная проблема?
  6. Вот кстати хорошая статья по "слабым" ссылкам в Delphi https://habrahabr.ru/post/282035/
  7. Ага, разобрался - все дело в объявлении TagObject как "слабой" ссылки: [Weak] FTagObject: TObject, т.е. присвоение этому полю не увеличивает счетчик ссылок и объект будет жив только в пределах вашей процедуры. Грубо говоря в "слабой" мы храним объект до тех пор, пока он хранится где то еще. Вам НЕОБХОДИМО создавать ГЛОБАЛЬНУЮ структуру для хранения этих объектов. К примеру сохранит картинки в TObjectList (модуль System.Generics.Collections), и после этого уже присваивать их в Image2.TagObject Вот работающий вариант вашего кода: unit copystream; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, System.Generics.Collections; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; SaveBut: TButton; LoadBut: TButton; procedure SaveButClick(Sender: TObject); procedure LoadButClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } FImageStore : TObjectList<TMemoryStream>; public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin FImageStore:=TObjectList<TMemoryStream>.Create; end; procedure TForm1.LoadButClick(Sender: TObject); begin if Assigned(Image2.TagObject) then Image2.Bitmap.LoadFromStream(Image2.TagObject as TMemoryStream); end; procedure TForm1.SaveButClick(Sender: TObject); Var LStream : TMemoryStream; begin LStream:=TMemoryStream.Create; FImageStore.Add(LStream); try Image1.Bitmap.SaveToStream(LStream); finally Image2.TagObject:=LStream; end; end; end.
  8. Действительно с TMemoryStream не работает, хотя вот так работает превосходно: procedure TForm1.LoadButClick(Sender: TObject); begin if Assigned(Image2.TagObject) then Image2.Bitmap.Assign(Image2.TagObject as TBitmap); end; procedure TForm1.SaveButClick(Sender: TObject); begin Image2.TagObject:=Image1.Bitmap; end; Насколько критично для вас использовать прокладку в виде TMemoryStream? С TMemoryStream счетчик Image2.TagObject.RefCount по какой то причине обнуляется при выходе из процедуры SaveButClick. Не понятно.
  9. Ну вот как так? Заинтриговали и закончили такой скудной развязкой. В чем была причина ошибки? Поделитесь с сообществом, а то как не дочитанная книга... ;-)
  10. Какой то странный хотфикс. Ничего не фиксит. Мой запрос https://quality.embarcadero.com/browse/RSP-17813 не пофиксили. "We also have an Android compatibility patch in the works to address Android issues around text input, control rendering and performanc" - я правильно перевел? Мы так же имеем фикс для самых насущных глюков, но вам не покажем.
  11. Подтверждаю, все заработало! Круто! ;-) Хоть и не в тему топика, но хочу какие нибудь вычисления замонстрячить!
  12. Действительно. Мог бы я и сам догадаться - функция возвращает куда больший кусок памяти чем описано структурой, вот лишние данные и залезают в память выделенную под другие нужды. Вот тут описание структуры http://docs.nvidia.com/cuda/cuda-runtime-api/structcudaDeviceProp.html#structcudaDeviceProp и видимо под каждую версию Cuda она своя. Или таскать именно cudart32_41_28.dll с приложением.
  13. Вместо утреннего кофе, уперся рогом и сделал получение информации через CUDA, тесовый проект прилагаю. В режиме отладки работает отлично, вижу размер видеопамяти, но потом вылетает с access violation (при обращении к визуальным компонентам или просто при продолжении работы). В чем дело понять не могу, сначала грешил на FMX, но проект на VCL выдает те же симптомы. Очень, очень странные дела... Код простой, используется cudaRT.pas из CUDA wraper Паскуда https://code.google.com/archive/p/pascuda/source/default/source и cudart32_65.dll идущая вместе с драйверами NVIDIA Var CudaDeviceProp : TCudaDeviceProp; hDevice: Integer; GPUMemorySize : Cardinal; LMessage : String; begin hDevice:=0; if CudaGetDeviceProperties(CudaDeviceProp, hDevice)=ceSuccess then begin GPUMemorySize:=CudaDeviceProp.TotalGlobalMem div 1024 div 1024; LMessage:=Format('GPU Memory size = %d Mb', [GPUMemorySize]); Memo.Lines.Add(LMessage); end; test099 Cuda Info VCL.7z
  14. Нет, ни в коем случае. Если стоят драйвера на видеокарту, то все будет работать. Можете попробовать запустить у себя бинарники и проверить, они выдают JSON на стандартный вывод, вот такой примерно: [ { "DeviceID": 0, "VendorID": 5208, "VendorName": "Gigabyte", "DeviceName": "GeForce GTX 960", "SMVersionString": "5.2", "SM_major": 5, "SM_minor": 2, "UUID": "GPU-f4867f81-dcc8-0f28-fbc2-b350e7927c22", "DeviceGlobalMemory": 4294967296, "pciDeviceId": 335614174, "pciSubSystemId": 918426712, "SMX": 8 } ] Нужный параметр DeviceGlobalMemory. Бинарники можно взять из архива https://github.com/nicehash/NiceHashMiner/releases/tag/1.7.5.10 , называются AMDOpenCLDeviceDetection.exe и CudaDeviceDetection.exe. Если переведете код в Delphi, буду безмерно благодарен. Сейчас в нескольких проектах (мониторинг "отваливания" карт) использую внешний вызов этих exe, что несколько неудобно.