<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.lessokaji.com/index.php?action=history&amp;feed=atom&amp;title=DObject</id>
	<title>DObject - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.lessokaji.com/index.php?action=history&amp;feed=atom&amp;title=DObject"/>
	<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=DObject&amp;action=history"/>
	<updated>2026-04-15T19:13:58Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=DObject&amp;diff=875&amp;oldid=prev</id>
		<title>Artheru：​创建页面，内容为“&lt;span id=&quot;dobject---shared-memory-communication-library&quot;&gt;&lt;/span&gt; = DObject - Shared Memory Communication Library =  DObject is a high-performance inter-process communication (IPC) library that enables shared memory communication between multiple processes on Windows and Linux platforms.  &lt;span id=&quot;overview&quot;&gt;&lt;/span&gt; == Overview ==  DObject provides a simple way to share data between processes using memory-mapped files. It handles process synchronization, memory…”</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=DObject&amp;diff=875&amp;oldid=prev"/>
		<updated>2024-12-21T11:29:37Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;lt;span id=&amp;quot;dobject---shared-memory-communication-library&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = DObject - Shared Memory Communication Library =  DObject is a high-performance inter-process communication (IPC) library that enables shared memory communication between multiple processes on Windows and Linux platforms.  &amp;lt;span id=&amp;quot;overview&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == Overview ==  DObject provides a simple way to share data between processes using memory-mapped files. It handles process synchronization, memory…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span id=&amp;quot;dobject---shared-memory-communication-library&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= DObject - Shared Memory Communication Library =&lt;br /&gt;
&lt;br /&gt;
DObject is a high-performance inter-process communication (IPC) library that enables shared memory communication between multiple processes on Windows and Linux platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;overview&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DObject provides a simple way to share data between processes using memory-mapped files. It handles process synchronization, memory management, and cross-platform compatibility.&lt;br /&gt;
&lt;br /&gt;
Key features: - Fast shared memory communication - Process synchronization with mutexes and events - Cross-platform support (Windows and Linux) - Automatic process tracking and cleanup - Version compatibility checking - Support for up to 8 concurrent processes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;usage-examples&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Usage Examples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;basic-usage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Basic Usage ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;// Create or connect to a shared memory object&lt;br /&gt;
var sharedObj = new DObject(&amp;quot;mySharedData&amp;quot;, 1024); // name and size in bytes&lt;br /&gt;
// Writing data&lt;br /&gt;
byte[] dataToWrite = new byte[] { 1, 2, 3, 4 };&lt;br /&gt;
sharedObj.Post(dataToWrite);&lt;br /&gt;
// Reading data&lt;br /&gt;
var reader = sharedObj.Reader(0, 4); // offset and length&lt;br /&gt;
byte[] data = reader();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;wait-and-signal-pattern&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Wait and Signal Pattern ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;// Process A&lt;br /&gt;
var sharedObj = new DObject(&amp;quot;syncData&amp;quot;, 1024);&lt;br /&gt;
sharedObj.Post(someData);&lt;br /&gt;
sharedObj.Set(); // Signal other processes&lt;br /&gt;
// Process B&lt;br /&gt;
var sharedObj = new DObject(&amp;quot;syncData&amp;quot;, 1024);&lt;br /&gt;
sharedObj.Wait(); // Wait for signal&lt;br /&gt;
var reader = sharedObj.Reader(0, dataSize);&lt;br /&gt;
var data = reader();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;real-world-example-camera-frame-sharing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Real-world Example (Camera Frame Sharing) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;// Producer (Camera Process)&lt;br /&gt;
var frameObj = new DObject(&amp;quot;cameraFrame&amp;quot;, 1920 1080 3); // RGB frame buffer&lt;br /&gt;
unsafe&lt;br /&gt;
{&lt;br /&gt;
// Write frame metadata&lt;br /&gt;
(int)frameObj.myPtr = width;&lt;br /&gt;
(int)(frameObj.myPtr + 4) = height;&lt;br /&gt;
(int)(frameObj.myPtr + 8) = channels;&lt;br /&gt;
// Copy frame data&lt;br /&gt;
Marshal.Copy(frameBuffer, 0, (IntPtr)(frameObj.myPtr + 12), frameSize);&lt;br /&gt;
frameObj.Set(); // Notify consumers&lt;br /&gt;
}&lt;br /&gt;
// Consumer (Display Process)&lt;br /&gt;
var frameObj = new DObject(&amp;quot;cameraFrame&amp;quot;, 1920 1080 3);&lt;br /&gt;
frameObj.Wait(); // Wait for new frame&lt;br /&gt;
unsafe&lt;br /&gt;
{&lt;br /&gt;
int width = (int)frameObj.myPtr;&lt;br /&gt;
int height = (int)(frameObj.myPtr + 4);&lt;br /&gt;
int channels = (int)(frameObj.myPtr + 8);&lt;br /&gt;
// Process frame data...&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;important-considerations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Important Considerations ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;memory-layout&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Memory Layout ===&lt;br /&gt;
&lt;br /&gt;
The shared memory is organized as follows: - First 1024 bytes: Metadata (process tracking, version info) - Remaining space: User data slots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;process-limits&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Process Limits ===&lt;br /&gt;
&lt;br /&gt;
* Maximum 8 concurrent processes can share the same DObject&lt;br /&gt;
* Process slots are automatically managed and cleaned up&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;platform-differences&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Platform Differences ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows ====&lt;br /&gt;
&lt;br /&gt;
* Uses native shared memory with EventWaitHandle&lt;br /&gt;
* Supports process-specific event signaling&lt;br /&gt;
* Version compatibility checking&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;linux&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Linux ====&lt;br /&gt;
&lt;br /&gt;
* Uses memory-mapped files&lt;br /&gt;
* File-based event synchronization&lt;br /&gt;
* Located in system temp directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thread-safety&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Thread Safety ===&lt;br /&gt;
&lt;br /&gt;
* All operations are thread-safe using mutexes&lt;br /&gt;
* Abandoned mutex detection and recovery&lt;br /&gt;
* Automatic mutex cleanup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;size-limitations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Size Limitations ===&lt;br /&gt;
&lt;br /&gt;
* Default cache size is 256MB&lt;br /&gt;
* Object names limited to 32 characters&lt;br /&gt;
* Individual object sizes should be carefully planned&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;error-handling&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Error Handling ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;try&lt;br /&gt;
{&lt;br /&gt;
var sharedObj = new DObject(&amp;quot;myData&amp;quot;, 1024);&lt;br /&gt;
// Use sharedObj...&lt;br /&gt;
}&lt;br /&gt;
catch (Exception ex)&lt;br /&gt;
{&lt;br /&gt;
// Handle initialization errors&lt;br /&gt;
Console.WriteLine($&amp;quot;DObject error: {ex.Message}&amp;quot;);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;best-practices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Best Practices ==&lt;br /&gt;
&lt;br /&gt;
# '''Resource Cleanup'''&lt;br /&gt;
#* DObjects are automatically cleaned up when processes exit&lt;br /&gt;
#* Use appropriate buffer sizes to avoid memory waste&lt;br /&gt;
# '''Error Handling'''&lt;br /&gt;
#* Always handle potential exceptions during mutex operations&lt;br /&gt;
#* Check return values from Wait operations&lt;br /&gt;
# '''Performance'''&lt;br /&gt;
#* Minimize the frequency of Post/Set operations&lt;br /&gt;
#* Use appropriate buffer sizes for your data&lt;br /&gt;
#* Consider using Reader delegates for frequent reads&lt;br /&gt;
# '''Version Compatibility'''&lt;br /&gt;
#* Different versions of applications using DObject should be compatible&lt;br /&gt;
#* Use version checking when required&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;limitations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Maximum 8 concurrent processes&lt;br /&gt;
* 32-character name limit&lt;br /&gt;
* Default 256MB total shared memory size&lt;br /&gt;
* Windows-specific features not available on Linux&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;configuration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The behavior can be modified through the configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;DObjectForceUseFile&amp;quot;: false, // Force file-based sharing even on Windows&lt;br /&gt;
&amp;quot;EnsureFlibSame&amp;quot;: true, // Enforce version compatibility&lt;br /&gt;
&amp;quot;SharedMemorySize&amp;quot;: 268435456 // Default 256MB (in bytes)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The configuration file &amp;lt;code&amp;gt;flib.json&amp;lt;/code&amp;gt; should be placed in: - Windows: Same directory as the executable - or on Linux: &amp;lt;code&amp;gt;~/.config/flib/flib.json&amp;lt;/code&amp;gt; could also be used&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;common-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Common Issues ==&lt;br /&gt;
&lt;br /&gt;
# '''Mutex Abandonment'''&lt;br /&gt;
#* Handled automatically with retry mechanism&lt;br /&gt;
#* May indicate crashed processes&lt;br /&gt;
# '''Version Mismatch'''&lt;br /&gt;
#* Different versions of applications may be incompatible&lt;br /&gt;
#* Check FundamentalLib versions&lt;br /&gt;
# '''Memory Overflow'''&lt;br /&gt;
#* Monitor buffer sizes&lt;br /&gt;
#* Use appropriate initial sizes&lt;br /&gt;
# '''Process Limits'''&lt;br /&gt;
#* Error when exceeding 8 processes&lt;br /&gt;
#* Check active processes if limit reached&lt;br /&gt;
# '''Configuration Not Found'''&lt;br /&gt;
#* Verify flib.json location&lt;br /&gt;
#* Check file permissions&lt;br /&gt;
#* Ensure valid JSON format&lt;br /&gt;
# '''Linux Permission Issues'''&lt;br /&gt;
#* Ensure write access to /tmp&lt;br /&gt;
#* Check SELinux policies if applicable&lt;br /&gt;
#* Verify user permissions&lt;br /&gt;
# '''Memory Allocation Failures'''&lt;br /&gt;
#* Check available system memory&lt;br /&gt;
#* Monitor total DObject allocations&lt;br /&gt;
#* Consider reducing individual object sizes&lt;br /&gt;
# '''Cross-Platform Compatibility'''&lt;br /&gt;
#* Test on both platforms&lt;br /&gt;
#* Handle platform-specific paths&lt;br /&gt;
#* Use platform-agnostic event handling&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
</feed>