سؤال

ومشكلتي: لقد DataReceived الحدث لمنفذ تسلسلي، والذي يستمع إلى منفذ تسلسلي ويلحق كل شيء لRichTextBox. الآن أود أن حفظ المحتوى RichTextBox في ملف txt. يمكنني أن أفعل هذا:

string text = RichTextBox.Text;
// save file
RichTextBox.Clear();

ولكن أخشى (ويرجى تصحيح لي إذا كنت مخطئا)، أن فقط بين بلدي اثنين من الإجراءات (حفظ المحتوى إلى متغير، RichTextBox واضح) إدخال آخر يمكن أن تأتي إلى منفذ تسلسلي. لأنني لم حفظه إلى بلدي متغير وأنا RichTextBox واضحة مباشرة بعد ذلك، يمكن حذف هذه البيانات الجديدة، من دون لي حتى مع العلم أنها موجودة من أي وقت مضى.

وهذا يمكن أن يحدث حقا، وكيف يمكنني تجنب ذلك؟

والشكر

هل كانت مفيدة؟

المحلول

لديك لمزامنة المدخلات الخاصة بك من المنفذ التسلسلي بطريقة أو بأخرى. أفترض أنك تستخدم استدعاء في حال DataReceived. حتى تتم أية تغييرات على محتويات RichTextBox بواسطة الخيط الرئيسي ويجب أن تكون آمنة.

ولكن مع تيار من المنفذ التسلسلي غير المرجح أن يكون RTF (هل لديك مشاكل أخرى إذا كان)، قد تستخدم كذلك مربع نص (MultLine = صحيح).

نصائح أخرى

ويمكن أن يحدث هذا إذا كنت تستخدم مواضيع متعددة. في تطبيق موضوع واحد، لن تحدث هذه المشكلة.

لمنع هذا، يمكنك استخدام مزامنة. هذه هي الطريقة التي يعمل: مقتطفات الشفرة التي تعمل على محتويات RichTextBox لا ينبغي أن يتم تنفيذها بشكل متزامن. تسمى هذه التعليمات البرمجية المتكررة مقاطع الهامة. عند إدخال مقطع حرج، يمكنك قفل مزامنة والافراج عنها عند إنهاء مقطع حرج. إذا تم تأمين مزامنة عند محاولة إدخال مقطع حرج، والانتظار حتى يتم تحرير هذا مزامنة، ثم القيام بعملك.

وبهذه الطريقة، إذا أي مساهمة يأتي من خلال المنفذ التسلسلي أثناء الكتابة إلى الملف، موضوع يستلم البيانات سوف ننتظر حتى ملف I / O الانتهاء ومن ثم إلحاقها إلى RichTextBox.

ويمكنك تحقيق ذلك باستخدام قفل بيان في ج #.

ومزيد من القراءة: المزامنة و <لأ href = "HTTP: //en.wikipedia كافيه / ويكي / Critical_section "يختلط =" نوفولو noreferrer "> مقطع الهامة

وبالتأكيد يمكن أن يحدث (وربما أراد).

ما لم تكن هناك اعتبارات أخرى، أعتقد أنك سوف تكون يقدم أفضل استخدام البيانات من تيار منفذ تسلسلي لكتابة ملف نصي مباشرة، بدلا من الكتابة إلى الملف باستخدام RichTextBox.Text. معالج الأحداث DataReceived ينبغي أن ننظر بشيء من هذا القبيل ...

private void SerialPort1.DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   string DataText = // code to read the serialport data and convert 
   //it into a string, which you already have so I 
   //won't repeat it here.

   WriteToTextBox(DataText);
   WriteToFile(DataText);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top