pub struct ForegroundExecutor { /* private fields */ }Expand description
Runs futures on the main thread, interleaved with event handling and drawing.
Get one from App::foreground_executor or crate::AsyncApp::foreground_executor.
Futures need only be 'static, so they can hold entity handles. Each poll
runs until the future returns Pending or Ready; an await can complete
immediately. Keep CPU-heavy work out of a foreground poll and move it to a
BackgroundExecutor. See
executors.
Implementations§
Source§impl ForegroundExecutor
impl ForegroundExecutor
Sourcepub fn new(dispatcher: Arc<dyn PlatformDispatcher>) -> Self
pub fn new(dispatcher: Arc<dyn PlatformDispatcher>) -> Self
Creates an executor that runs futures on the main thread through dispatcher.
Platform code creates the executor. Apps get one from
App::foreground_executor or crate::AsyncApp::foreground_executor.
Sourcepub fn spawn<R>(&self, future: impl Future<Output = R> + 'static) -> Task<R> ⓘwhere
R: 'static,
pub fn spawn<R>(&self, future: impl Future<Output = R> + 'static) -> Task<R> ⓘwhere
R: 'static,
Runs future on the main thread, and returns a task for its result.
The future needn’t be Send, so it can hold entity handles and other state that
lives on the main thread. Each poll runs until the future returns Pending or
Ready; an await can complete immediately. Keep long computations out of a poll
and use BackgroundExecutor::spawn for them. Dropping the task cancels the
future, but cannot interrupt synchronous code already running on this thread.
§Examples
use gpui::TestApp;
let app = TestApp::new();
let answer = app.foreground_executor().spawn(async { 6 * 7 });
assert_eq!(app.foreground_executor().block_test(answer), 42);Sourcepub fn spawn_with_priority<R>(
&self,
_priority: Priority,
future: impl Future<Output = R> + 'static,
) -> Task<R> ⓘwhere
R: 'static,
pub fn spawn_with_priority<R>(
&self,
_priority: Priority,
future: impl Future<Output = R> + 'static,
) -> Task<R> ⓘwhere
R: 'static,
Like ForegroundExecutor::spawn. The priority is ignored: foreground futures run
in the order they were spawned.
Sourcepub fn spawn_when_idle<R>(
&self,
timeout: Option<Duration>,
future: impl Future<Output = R> + 'static,
) -> Task<R> ⓘwhere
R: 'static,
pub fn spawn_when_idle<R>(
&self,
timeout: Option<Duration>,
future: impl Future<Output = R> + 'static,
) -> Task<R> ⓘwhere
R: 'static,
Runs future on the main thread when the platform is idle.
Use this for low-priority UI work that can wait. timeout sets how long the
future may wait. None lets it wait as long as the platform stays busy. With a
timeout, a poll that is still waiting after that long runs as ordinary main-thread
work. On platforms without idle scheduling the future runs at low priority, and
timeout is ignored.
Each poll uses part of one idle slice. Long synchronous stretches should check
ForegroundExecutor::idle_time_remaining and yield when it runs low.
Sourcepub fn idle_time_remaining(&self) -> Option<Duration>
pub fn idle_time_remaining(&self) -> Option<Duration>
Returns how much of the current idle slice is left.
Call it from a future that was spawned with
ForegroundExecutor::spawn_when_idle. Returns None on platforms that don’t
meter idle time, and when the call isn’t inside an idle slice. In that case,
fall back to a budget of your own.
Sourcepub fn block_test<R>(&self, future: impl Future<Output = R>) -> R
pub fn block_test<R>(&self, future: impl Future<Output = R>) -> R
Runs future on the main thread until it completes, and returns its output. Only
available in tests.
If the future is waiting and no other test work can run, the simulated clock moves to the next timer.
§Panics
Panics if future is waiting, no timer is pending, and parking isn’t allowed.
Sourcepub fn block_on<R>(&self, future: impl Future<Output = R>) -> R
pub fn block_on<R>(&self, future: impl Future<Output = R>) -> R
Blocks the current thread until future completes, and returns its output.
Prefer ForegroundExecutor::block_with_timeout, which gives up instead of
waiting indefinitely.
Sourcepub fn block_with_timeout<R, Fut: Future<Output = R>>(
&self,
duration: Duration,
future: Fut,
) -> Result<R, impl Future<Output = R> + use<R, Fut>>
pub fn block_with_timeout<R, Fut: Future<Output = R>>( &self, duration: Duration, future: Fut, ) -> Result<R, impl Future<Output = R> + use<R, Fut>>
Blocks the current thread until future completes or duration passes.
Returns Ok with the output if the future finished. Otherwise returns Err with
the unfinished future, which you can poll later.
§Examples
use std::time::Duration;
use gpui::TestApp;
let app = TestApp::new();
let result = app
.foreground_executor()
.block_with_timeout(Duration::from_secs(1), async { 5 });
assert_eq!(result.ok(), Some(5));Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for ForegroundExecutor
impl !Send for ForegroundExecutor
impl !Sync for ForegroundExecutor
impl !UnwindSafe for ForegroundExecutor
impl Freeze for ForegroundExecutor
impl Unpin for ForegroundExecutor
impl UnsafeUnpin for ForegroundExecutor
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
replaced by palette::chromatic_adaptation::AdaptIntoUnclamped
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
replaced by palette::chromatic_adaptation::AdaptIntoUnclamped
Source§impl<T, C> AdaptIntoUnclamped<T> for Cwhere
T: AdaptFromUnclamped<C>,
impl<T, C> AdaptIntoUnclamped<T> for Cwhere
T: AdaptFromUnclamped<C>,
Source§type Scalar = <T as AdaptFromUnclamped<C>>::Scalar
type Scalar = <T as AdaptFromUnclamped<C>>::Scalar
Source§fn adapt_into_unclamped_with<M>(self) -> Twhere
M: LmsToXyz<<C as AdaptIntoUnclamped<T>>::Scalar> + XyzToLms<<C as AdaptIntoUnclamped<T>>::Scalar>,
fn adapt_into_unclamped_with<M>(self) -> Twhere
M: LmsToXyz<<C as AdaptIntoUnclamped<T>>::Scalar> + XyzToLms<<C as AdaptIntoUnclamped<T>>::Scalar>,
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<T, C> ComponentsInto<C> for T
impl<T, C> ComponentsInto<C> for T
Source§fn components_into(self) -> C
fn components_into(self) -> C
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other into Self, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self into T, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read more