Moharram
چهارشنبه 21 تیر 1391, 09:31 صبح
سلام
يه سخت افزار دارم كه برام يه شمارنده از طريق شبكه ميفرسته و پس از دريافت براي اطمينان از صحت دريافت، اون شمارنده رو چك ميكنم تا ببينم چيزي گم شده يا نه ...
تو بخش سخت افزار يه حافظه اي وجود داره كه ديتا توي اون ريخته ميشه. اين حافظه رو ويندوز ميخونه و بعنوان ديتاي دريافتي از شبكه تحويل ميده.
تو بخش نرم افزار يه برنامه ساده نوشتم. به اين صورت كه يه كلاس از CAsyncSocket مشتق كردم و براي OnReceive اون تابع نوشتم. هر وقت كه رويداد OnReceive فعال بشه ميرم و ديتا رو برميدارم.
ويندوز ممكنه اون حافظه سخت افزار رو نرسه خالي بكنه، واسه همين تو سخت افزار پر بودن حافظه رو چك ميكنم. مثلا اگه پر باشه يعني فعلا نميشه ديتايي فرستاد، بنابراين شمارنده مون رو افزايش نميدم و منتظر ميشيم تا حافظه جاي خالي پيدا كنه.
تا اينجا همه چي درسته و ديتا رو با سرعت 900Mbps دريافت ميكنم بدون گم شدگي ...!!! محاسبه سرعت رو به اين صورت انجام ميدم كه تو يه بازه زماني ديتاي دريافتي رو تقسيم بر زمان ميكنم ...
اما ...
ميخوام برنامه همزمان بشه. يعني فرض كنيم كه به جاي شمارنده ميخواهيم نمونه هاي يه مبدل ADC رو بفرستيم. يعني اين بار نميتونيم مثل حالت شمارنده، وقتي اون حافظه پر شد، دست نگه داريم تا جاي خالي پيدا شه وگرنه ديتا از دست ميره.
دريافت ديتا رو مثل قبل انجام دادم. تا وقتي تو برنامه روي مثلا Title كليك نكنيم تا يه جايي ديتا درست مياد. اما انگار خيلي وابسته به ويندوزه و با يك كليك رو GUI اون حافظه پر ميشه و همين كافيه كه ديتا رو از دست بديم.
سعي كردم خوندن از شبكه رو توي يه Thread، انجام بدم تا مستقل از GUI بشه اما بهتر نشد.
اصلا نميدونم ميشه با شبكه و سوكت چنين انتقال همزماني رو انجام داد يا نه؟ نميدونم شايد هم توي موازي سازي اشتباهي كردم؟
منتظر راهنمايي دوستان هستم
با تشكر از توجهتون
يه سخت افزار دارم كه برام يه شمارنده از طريق شبكه ميفرسته و پس از دريافت براي اطمينان از صحت دريافت، اون شمارنده رو چك ميكنم تا ببينم چيزي گم شده يا نه ...
تو بخش سخت افزار يه حافظه اي وجود داره كه ديتا توي اون ريخته ميشه. اين حافظه رو ويندوز ميخونه و بعنوان ديتاي دريافتي از شبكه تحويل ميده.
تو بخش نرم افزار يه برنامه ساده نوشتم. به اين صورت كه يه كلاس از CAsyncSocket مشتق كردم و براي OnReceive اون تابع نوشتم. هر وقت كه رويداد OnReceive فعال بشه ميرم و ديتا رو برميدارم.
ويندوز ممكنه اون حافظه سخت افزار رو نرسه خالي بكنه، واسه همين تو سخت افزار پر بودن حافظه رو چك ميكنم. مثلا اگه پر باشه يعني فعلا نميشه ديتايي فرستاد، بنابراين شمارنده مون رو افزايش نميدم و منتظر ميشيم تا حافظه جاي خالي پيدا كنه.
تا اينجا همه چي درسته و ديتا رو با سرعت 900Mbps دريافت ميكنم بدون گم شدگي ...!!! محاسبه سرعت رو به اين صورت انجام ميدم كه تو يه بازه زماني ديتاي دريافتي رو تقسيم بر زمان ميكنم ...
اما ...
ميخوام برنامه همزمان بشه. يعني فرض كنيم كه به جاي شمارنده ميخواهيم نمونه هاي يه مبدل ADC رو بفرستيم. يعني اين بار نميتونيم مثل حالت شمارنده، وقتي اون حافظه پر شد، دست نگه داريم تا جاي خالي پيدا شه وگرنه ديتا از دست ميره.
دريافت ديتا رو مثل قبل انجام دادم. تا وقتي تو برنامه روي مثلا Title كليك نكنيم تا يه جايي ديتا درست مياد. اما انگار خيلي وابسته به ويندوزه و با يك كليك رو GUI اون حافظه پر ميشه و همين كافيه كه ديتا رو از دست بديم.
سعي كردم خوندن از شبكه رو توي يه Thread، انجام بدم تا مستقل از GUI بشه اما بهتر نشد.
اصلا نميدونم ميشه با شبكه و سوكت چنين انتقال همزماني رو انجام داد يا نه؟ نميدونم شايد هم توي موازي سازي اشتباهي كردم؟
منتظر راهنمايي دوستان هستم
با تشكر از توجهتون