অন্য থ্রেড থেকে কীভাবে কলসি ইঞ্জিন পদ্ধতি কল করতে হয়


9

আমি লিনাক্সের জন্য ফ্লটার ডেস্কটপ ব্যবহার করছি। আমি এমন একটি পদ্ধতি কল করছি MarkTextureFrameAvailableযা ইঞ্জিন দ্বারা রেন্ডার করার জন্য একটি টেক্সচার চিহ্নিত করার কথা। যেহেতু আমি কোনও ভিডিও প্লেয়ার প্রোগ্রামিং করছি MarkTextureFrameAvailableতাই প্লেয়ারের থ্রেড থেকে আমার কল করা দরকার । সমস্যাটি হ'ল ইঞ্জিন আমাকে MarkTextureFrameAvailableথ্রেড (এবং অন্য কোনও ইঞ্জিন পদ্ধতি) কল করতে বাধ্য করে যা ইঞ্জিন তৈরি করেছে।

আপনি দেখতে পাচ্ছেন যে ইঞ্জিনের সমস্ত কল শেলের মধ্যে শেষ হয় যা কলটি একই থ্রেড থেকে কলগুলি তৈরি করা হচ্ছে কিনা তা সর্বদা পরীক্ষা করে থাকে:

task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()

( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 )

এইভাবে আমি ফ্লটার ইঞ্জিন তৈরি করছি:

int main(int argc, char **argv) {
  //..

  flutter::FlutterWindowController flutter_controller(icu_data_path);

  // Start the engine.
  if (!flutter_controller.CreateWindow(800, 600, "Flutter WebRTC Demo", assets_path,
                                       arguments)) {
    return EXIT_FAILURE;
  }

  // Register any native plugins.
  FlutterWebRTCPluginRegisterWithRegistrar(
      flutter_controller.GetRegistrarForPlugin("FlutterWebRTCPlugin"));

  // Run until the window is closed.
  flutter_controller.RunEventLoop();
  return EXIT_SUCCESS;
}

যেমন আপনি দেখতে পাচ্ছেন, যে থ্রেডটি ইঞ্জিন তৈরি করে তা দ্বারা অবরুদ্ধ হয়ে flutter_controller.RunEventLoop();যায় কেবলমাত্র আমিই এমন ইভেন্টের প্রেরণকারী রাখতে পারি যা মূল থ্রেড থেকে জিনিসগুলি কার্যকর করতে বাধ্য করে। আমি এই ধারণা পছন্দ করি না। যদিও RunEventLoopWithTimeoutবিদ্যমান, আমার একটি সময়সীমা স্থাপন এবং MarkTextureFrameAvailableকলগুলির জন্য একটি সারিতে চেক করা চালিয়ে যাওয়া দরকার । আমি মনে করি না এটি সর্বোত্তম।

তাহলে আমি কীভাবে MarkTextureFrameAvailableমূল থ্রেড থেকে কল করব ?

আমি MarkTextureFrameAvailableএখানে ব্যবহারের একটি উদাহরণ পেয়েছি : https://github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/flutter_video_renderer.cc#L90 এবং দেখে মনে হচ্ছে এটি এটি অন্য থ্রেড বলে। কিভাবে এটা সম্ভব? আমি যখন করি, তখন আমি একটি চূড়ান্ত ত্রুটি পাই, তবে তিনি করেন এবং এটি কার্যকর হয়?

এই উদাহরণটিতে কোন থ্রেড অনফ্রেমকে কল করে তা জানার চেষ্টা করে আমি দু'দিন কাটিয়েছি তবে এটি খুঁজে পেলাম না কারণ এটি https://github.com/flutter-webrtc/libwebrtc ব্যবহার করে যা গুগলের ওয়েব্রটসি ব্যবহার করে: https://github.com/ জাম্পিংইয়াং 1001 / ওয়েব্র্টসি যা অনফ্রেমটি কোথা থেকে ডাকা হয়েছে তা খুঁজে পাওয়ার জন্য আমার পক্ষে খুব বড়। তবে এটি অবশ্যই আমাকে একটি সুতো থেকে নেওয়া উচিত। কিভাবে এটা সম্ভব?


আপনি যদি প্রধান রানলুপে পর্যায়ক্রমিক কাজগুলি চালনার জন্য টাইমআউট ব্যবহারের বিকল্প চান, তবে আপনি একটি র‌্যাপারের মাধ্যমে glfwPostEmptyEvent প্রকাশের জন্য একটি ফ্লটার ইঞ্জিন পিআর জমা দিতে পারেন। মূল রানলুপটি জাগ্রত করার একটি উপায় হ'ল জিএলএফডাব্লু এম্বেডিং এপিআই যুক্তিসঙ্গত সংযোজন।
স্মারগান

@ এসমরগান আমি এটি চেষ্টা করব, তবে আমি কীভাবে এই উদাহরণটি দেখে অবাক হই : github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/… রানইভেন্টলুপ উইথটাইম ছাড়াই কী করে? যেহেতু তিনি মূল থ্রেডটি অবরুদ্ধ করে রেখেছেন flutter_controller.RunEventLoop()তাই MarkTextureFrameAvailableঅবশ্যই অন্য থ্রেড থেকে ডেকে আনতে হবে, যা অসম্ভব!
লুকাস জানেেলা

আমার মন্তব্যের আগে দ্রুত সতর্কবাণী - কখনই ফ্লুরের কথা শোনেনি, লিনাক্স সম্পর্কে খুব কমই জানেন, এবং আমি মোবাইলে আছি তাই এখনই কোডটি সন্ধান করছেন না। আশা করি আমি এখনও সাহায্য করতে পারি। :) আপনি যে উদাহরণটি দিয়েছেন তার ভিডিও রেন্ডারারের মূল ফ্লাটার রেন্ডারারের উদাহরণের মতো দেখতে পাওয়া যায়। এগুলি OnRenderহ'ল ফ্লুটারের ভার্চুয়াল ওভাররাইড তাই এটি ঝাঁকুনির থ্রেডের দ্বারা আহ্বান জানানো হয়।
পিকল রিক

উত্তর:


3

এই উত্তরটি সম্পর্কে সতর্কতার জন্য আমার মন্তব্য দেখুন। দেখা যাচ্ছে যে আপনি সরবরাহ করেছেন উদাহরণস্বরূপ প্রকল্পটি একটি সহজ কৌশল দ্বারা এটি সম্পন্ন করে। তারা একটি নতুন বর্গ তৈরি করে যা উত্তেজিত রেন্ডারার শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত হয়, OnFrameঅন্যান্য বিষয়ের মধ্যে ওভাররাইড করে । যখন ওভাররাইডটি কল হয় এটি এলোমেলো থ্রেডের প্রসঙ্গে এবং তাই প্রত্যাশার মতো কাজ করে।


আপনাকে সাহায্য করার চেষ্টা করে অনেক ধন্যবাদ! যাইহোক, ফ্লটার থেকে ক্লাসটি এটি সাবক্লাস Texture,যা অনফ্রেম পদ্ধতি নেই। সেই অনফ্রেম পদ্ধতিটিই RTCVideoRendererযার থেকে তেঁতুলের সাথে কোনও সম্পর্ক নেই।
লুকাস জানেেলা

এখানে দেখুন । দেখে মনে হচ্ছে তারা ফ্লুরকে ওভাররাইড করে এবং সম্ভবত একটি সমর্থিত প্লাগইন সিস্টেম ব্যবহার করে। আমার সেরা পরামর্শ হ'ল ফ্লাটার ডকুমেন্টেশন পড়ুন। আমি বাজি রাখতে রাজি হব যদি আপনি অনফ্রেমে কোনও বিপি রাখেন তবে এটি প্রত্যাশার মতো ঝাঁকুনির থ্রেডের প্রসঙ্গে হবে।
পিকল রিক

আমি প্লাগিন সিস্টেমটি ব্যবহার করে নিলাম এবং ডকুমেন্টেশন পড়েছি, অনফ্রেম পদ্ধতি নেই। ফ্লুটারভিডিও রেন্ডারার ক্লাসে ফ্লটার থেকে একমাত্র জিনিস টেক্সচার, যার কোনও অনফ্রেম পদ্ধতি নেই। আসলে আমি খুঁজে পেয়েছি যেখানে অনফ্রেমটি সংজ্ঞায়িত হয়েছে এবং আপনি ওয়েবআরটিটিসি
লুকাস জ্যানেলা

@ লুকাসাজনেলা পিকল রিক ঠিক আছে, দুটি শ্রেণীর FlutterVideoRenderer উত্তরাধিকারী - Texture(লাইন 16) এবং RTCVideoRenderer<scoped_refptr<RTCVideoFrame>>(লাইন 17) (সি ++ একাধিক উত্তরাধিকারের অনুমতি দেয়) এবং তারপরে এটি OnFrameপদ্ধতি (লাইন 24) ওভাররাইড করে । যখন OnFrameঘটনা বহিস্কার করা হয়, এটি আপনার মূল থ্রেড প্রেক্ষাপটে মৃত্যুদন্ড কার্যকর করা হয়।
4LegsDrivenCat

@ 4 লেগসড্রাইভনকিট কিন্তু অনফ্রেম তোলপাড় থেকে নয়, এটি আরটিসিভিডিও রেন্ডারারের থেকে যা কোনও ফড়ক থেকে নয়
লুকাস জ্যানেলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.