<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888979</guid>
        <pubDate>Sun, 02 Apr 2023 09:29:40 +0000</pubDate>
        <title>Как проверить наличие массива по ссылке в памяти</title>
        <link>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888979</link>
        <description><![CDATA[Pit-Bul: <strong class='tag-b'>MaIron</strong>, на счет мютексов вы правы, но потоки не конкурентные, и вместо мьютексов я использую локи, что немного ускоряет работу потоков (плюсовые библиотеки мои).<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433970&view=findpost&p=3888974'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MaIron &#064; <time class="tag-quote__quoted-time" datetime="2023-04-01T23:59:35+03:00">01.04.23, 20:59</time></span><div class='quote '>Передавать ссылки на память из одного потока в другой уже само по себе опасно, именно по этой причине &quot;Проверка IntPtr BytesArray &#33;= IntPtr.Zero не дает результата, ибо ссылка существует, но нет по ней данных.&quot;<br>
Решение передать данные через буфер, скопировать их и при закрытии потока источника данные не потеряются.</div></div><br>
<br>
передавать объекты из плюсов калбеком я думаю усложнит и усугубит ситуацию, хотя может я и ошибаюсь, но все таки обычно принято передавать в калбеке ссылку. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433970&view=findpost&p=3888974'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MaIron &#064; <time class="tag-quote__quoted-time" datetime="2023-04-01T20:59:35+00:00">01.04.23, 20:59</time></span><div class='quote '>Ещё неясно, есть ли доступ к исходникам библиотеки на С++. Если есть, то можно реализовать вариант и со ссылкой, в момент закрытия библиотеки, сообщать потоку на С# что происходит закрытие и все ссылки обнуляются.</div></div><br>
<br>
тут больше проблема в другом. Шарповая чать знает о том что потоки уже закрыты, но пока по не совсем понятной мне причине калбек срабатывает уже после того как на стороне шарпового GUI приняты все меры, а на плюсовой стороне уже уничтожены все объекты. Есть подозрение что причина в том что GUI медленнее обрабатывает данные чем дают потоки на плюсах, и на стороне шарпа образуется некая очередь, но это только предположение, доказательств и подтверждения подобного поведения не нашел на просторах интернета.<br>
<br>
Вывод для меня простой. Так как потея данных на стороне GUI не критична, потому что все основные обработки и сохранение данных делается на плюсовой стороне, где подобных проблем нет, а код на шарповой части только для отображения процесса пользователю, нужна защита при приеме данных на шарповой стороне. Но способа проверки наличия данных по ссылке и шарпа я не нашел, надеюсь пока. Сейчас я сделал небольшой костыль на плюсовой стороне, я не уничтожаю объекты при остановке потока, а очищаю их либо при запуске по новой, либо убиваю при деинициализации плюсовой библиотеки. Пока работает, но мне костыль не нравиться, ибо при модификации кода в будущем все может поломаться опять и может потребовать более изощренных костылей.]]></description>
        <author>Pit-Bul</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888974</guid>
        <pubDate>Sat, 01 Apr 2023 20:59:35 +0000</pubDate>
        <title>Как проверить наличие массива по ссылке в памяти</title>
        <link>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888974</link>
        <description><![CDATA[MaIron: Мне кажется, здесь неверно выбран подход к обмену данными. <br><br>Передавать ссылки на память из одного потока в другой уже само по себе опасно, именно по этой причине &quot;Проверка IntPtr BytesArray &#33;= IntPtr.Zero не дает результата, ибо ссылка существует, но нет по ней данных.&quot;<br>Решение передать данные через буфер, скопировать их и при закрытии потока источника данные не потеряются.<br><br>Ещё неясно, есть ли доступ к исходникам библиотеки на С++. Если есть, то можно реализовать вариант и со ссылкой, в момент закрытия библиотеки, сообщать потоку на С# что происходит закрытие и все ссылки обнуляются.]]></description>
        <author>MaIron</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888973</guid>
        <pubDate>Sat, 01 Apr 2023 20:37:29 +0000</pubDate>
        <title>Как проверить наличие массива по ссылке в памяти</title>
        <link>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888973</link>
        <description><![CDATA[Profi: Как это поможет, когда массив удалится из памяти библиотекой?]]></description>
        <author>Profi</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888969</guid>
        <pubDate>Sat, 01 Apr 2023 18:24:40 +0000</pubDate>
        <title>Как проверить наличие массива по ссылке в памяти</title>
        <link>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888969</link>
        <description><![CDATA[MaIron: Чтобы избежать этой проблемы, можно использовать синхронизацию доступа к массиву данных в момент передачи ссылки из плюсовой библиотеки в пользовательский интерфейс на C#. Для этого можно использовать мьютексы или другие механизмы синхронизации, которые обеспечат безопасный доступ к данным.<br>
<br>
Вот пример кода на C#, который использует мьютекс для безопасного доступа к массиву данных из разных потоков:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">using System.Threading;</div><div class="code_line">public class DataBuffer</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;private byte[] _data;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private Mutex _mutex;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public DataBuffer()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_data = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_mutex = new Mutex();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public void SetData(byte[] data)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_mutex.WaitOne();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_data = data;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_mutex.ReleaseMutex();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public byte[] GetData()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;byte[] result = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_mutex.WaitOne();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (_data != null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;result = new byte[_data.Length];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Array.Copy(_data, result, _data.Length);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_mutex.ReleaseMutex();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return result;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
В этом примере класс DataBuffer представляет буфер данных, который может быть доступен из нескольких потоков. Метод SetData() используется для установки данных в буфер, а метод GetData() используется для получения копии данных из буфера. При доступе к буферу используется мьютекс для синхронизации потоков.<br>
<br>
Вы можете использовать этот класс для хранения ссылки на массив данных, полученных из плюсовой библиотеки, и обеспечения безопасного доступа к этим данным из пользовательского интерфейса на C#. В методе SetData() вы можете устанавливать ссылку на массив данных, полученных из плюсовой библиотеки, а в методе GetData() вы можете получать копию данных из массива, используя мьютекс для синхронизации доступа к массиву данных.]]></description>
        <author>MaIron</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888928</guid>
        <pubDate>Fri, 31 Mar 2023 11:59:31 +0000</pubDate>
        <title>Как проверить наличие массива по ссылке в памяти</title>
        <link>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888928</link>
        <description><![CDATA[Profi: <strong class='tag-b'>Core 6</strong> нет&#33; После <strong class='tag-b'>Core 3.1</strong> все пошло в <strong class='tag-b'>.Net 5</strong> и далее. Но это печально тогда да. Блин, попробую покопаться, но я с <strong class='tag-b'>Marshal</strong>&#39;ингом уже лет шесть не работал.]]></description>
        <author>Profi</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888923</guid>
        <pubDate>Fri, 31 Mar 2023 09:30:49 +0000</pubDate>
        <title>Как проверить наличие массива по ссылке в памяти</title>
        <link>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888923</link>
        <description><![CDATA[Pit-Bul: <strong class='tag-b'>Profi</strong>, проект на Core6]]></description>
        <author>Pit-Bul</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888912</guid>
        <pubDate>Thu, 30 Mar 2023 21:00:25 +0000</pubDate>
        <title>Как проверить наличие массива по ссылке в памяти</title>
        <link>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888912</link>
        <description><![CDATA[Profi: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433970&view=findpost&p=3888838'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Pit&#045;Bul &#064; <time class="tag-quote__quoted-time" datetime="2023-03-30T04:12:05+00:00">30.03.23, 04:12</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433970&view=findpost&p=3888795'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Profi &#064; <time class="tag-quote__quoted-time" datetime="2023-03-29T06:07:25+00:00">29.03.23, 06:07</time></span><div class='quote '>Ну, всегда остается <strong class='tag-b'>try-catch</strong> как план <strong class='tag-b'>B</strong>.<br>
Попробую найти какую-нибудь тестовую <strong class='tag-b'>C++</strong> библиотеку для экспериментов.</div></div><br>
<strong class='tag-b'>try-catch</strong> не ловит System.AccessViolationException, в этом то и проблема, это необрабатываемое исключение из неуправляемого кода.</div></div><br>
До <strong class='tag-b'>.Net 6</strong> можно - <a class='tag-url' href='https://learn.microsoft.com/en-us/dotnet/api/system.runtime.exceptionservices.handleprocesscorruptedstateexceptionsattribute?view=net-5.0' target='_blank'><strong class='tag-b'>HandleProcessCorruptedStateExceptionsAttribute</strong></a>]]></description>
        <author>Profi</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888838</guid>
        <pubDate>Thu, 30 Mar 2023 04:12:05 +0000</pubDate>
        <title>Как проверить наличие массива по ссылке в памяти</title>
        <link>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888838</link>
        <description><![CDATA[Pit-Bul: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433970&view=findpost&p=3888795'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Profi &#064; <time class="tag-quote__quoted-time" datetime="2023-03-29T06:07:25+00:00">29.03.23, 06:07</time></span><div class='quote '>Ну, всегда остается <strong class='tag-b'>try-catch</strong> как план <strong class='tag-b'>B</strong>.<br>
Попробую найти какую-нибудь тестовую <strong class='tag-b'>C++</strong> библиотеку для экспериментов.</div></div><br>
<strong class='tag-b'>try-catch</strong> не ловит System.AccessViolationException, в этом то и проблема, это необрабатываемое исключение из неуправляемого кода.]]></description>
        <author>Pit-Bul</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888795</guid>
        <pubDate>Wed, 29 Mar 2023 06:07:25 +0000</pubDate>
        <title>Как проверить наличие массива по ссылке в памяти</title>
        <link>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888795</link>
        <description><![CDATA[Profi: Ну, всегда остается <strong class='tag-b'>try-catch</strong> как план <strong class='tag-b'>B</strong>.<br>
Попробую найти какую-нибудь тестовую <strong class='tag-b'>C++</strong> библиотеку для экспериментов.]]></description>
        <author>Profi</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888794</guid>
        <pubDate>Wed, 29 Mar 2023 04:30:10 +0000</pubDate>
        <title>Как проверить наличие массива по ссылке в памяти</title>
        <link>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888794</link>
        <description><![CDATA[Pit-Bul: Нет к сожалению. Теперь на этой проверке <br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">System.AccessViolationException: &#39;Attempted to read or write protected memory. This is often an indication that other memory is corrupt.&#39;</div></ol></div></div></div></div>]]></description>
        <author>Pit-Bul</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888788</guid>
        <pubDate>Tue, 28 Mar 2023 18:52:00 +0000</pubDate>
        <title>Как проверить наличие массива по ссылке в памяти</title>
        <link>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888788</link>
        <description><![CDATA[Profi: Проверить данные можно через:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">if (Marshal.ReadIntPtr(bytesArray, 0) != IntPtr.Zero) {</div><div class="code_line">&nbsp;&nbsp;//...</div><div class="code_line">}</div></ol></div></div></div></div><br>
нет?]]></description>
        <author>Profi</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888740</guid>
        <pubDate>Tue, 28 Mar 2023 10:35:58 +0000</pubDate>
        <title>Как проверить наличие массива по ссылке в памяти</title>
        <link>https://forum.sources.ru/index.php?showtopic=433970&amp;view=findpost&amp;p=3888740</link>
        <description><![CDATA[Pit-Bul: Добрый день всем, проблемка нарисовалась и не могу найти решение. Есть библиотека написанная на С++ в которой несколько потоков получают данные от железа и по колбеку отдают ссылку на массив данных в памяти. Пользовательский интерфейс на шарпе. Я просто подписываюсь на колбек  плюсовой библиотеки и через Marshal.Copy копирую данные в массив байт (byte[]). Проблема в том что в момент прерывания потока в плюсовой библиотеке в колбеке на шарповой стороне из-за того что ссылка ссылается на уже уничтоженный объект в памяти, возникает необрабатываемое исключение. Так вот вопрос, как проверить на шарпе есть ли данные по ссылке или нет. Проверка IntPtr BytesArray &#33;= IntPtr.Zero не дает результата, ибо ссылка существует, но нет по ней данных. Короче как то так, надеюсь понятно изложил.]]></description>
        <author>Pit-Bul</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	